纯Java——简易高并发框架

0.源代码

github-简易高并发框架

注:本篇博客知识来自于网课。

1.问题来源以及w

对于一个题库系统。考试组要有批量的离线文档要生成。题库组批量的题目要进行排重,且要根据条件批量修改题目内容。对于

痛点:

  • 批量任务完成缓慢
  • 所有的问题都围绕着“查询”,即查询进度影响总体性能
  • 我们希望尽量使用友好(如果用多线程来提高性能,我们希望能屏蔽细节)

因此我们需要一个可以提供查询进度通用的框架。

2.我们该怎么做?

这里先要明确“任务”(Task)和“工作”(Job)的关系。对于一个工作,他内部可能须有许多的任务,任务是他的子元素(属性、字段)。

  • 用并发安全的类确保每个工作的属性和工作下的每个任务信息,也意味着工作和任务的注册机制
  • 需要并发安全的类保存每个任务的处理结果(TaskResult)。
  • 需要提供查询接口,供外部的使用。

这里我们不处理对于工作的检查。有兴趣的可以实现。

3.总体流程

 

这里不按照流程讲解,而是按照类关系从下而上讲解。

4.目录结构

 

5.TaskResultType

package me.hcFramework.pool.vo;

//这个类只是用来作为标志的信息。
public enum TaskResultType {
	SUCCESS,    //表示任务成功
	FAILSURE,   //表示任务失败
	EXCEPTION;  //表示发生了异常,这里我们不去详尽判断,只用这个标示来笼统表示	
}

6.TaskResult

package me.hcFramework.pool.vo;

/**
 *
 * @param <R> 业务方法处理后的业务结果数据的类型
 * 
 * 对属性使用final修饰是为了使其不可改
 */
public class TaskResult<R> {
	//用户业务是否成功完成
	private final TaskResultType resultType;
	//业务方法处理后的业务结果数据
	private final R returnType;
	//如果失败,则失败原因
	private final String reason;
	
    //针对任务失败的构造方法
	public TaskResult(TaskResultType resultType , R returnType , String reason) {
		this.resultType = resultType;
		this.returnType = returnType;
		this.reason = reason;
	}
	
    //针对任务成功的构造方法
	public TaskResult(TaskResultType resultType , R returnType) {
		this.resultType = resultType;
		this.returnType = returnType;
		this.reason =
### Java 并发编程框架概述 Java并发编程框架旨在简化多线程环境下的开发工作,提供了一系列工具和库来处理复杂的并发问题。通过利用这些组件,开发者能够构建高性能、可靠的应用程序。 #### 主要组成部分 - **Executor 框架**:用于管理和调度线程的任务执行服务[^1]。 Executor接口及其子类ThreadPoolExecutor允许创建不同类型的线程池,从而有效地分配资源给多个任务。这不仅提高了系统的响应速度,还减少了内存占用。 - **同步器(Synchronizers)**:如CountDownLatch, CyclicBarrier等,用来协调多个线程之间的操作顺序[^3]。 这些同步辅助类使得控制一组线程的行为变得简单明了,比如等待某些条件满足后再继续运行其他部分的逻辑。 - **原子变量与CAS (Compare-and-Swap)** :支持无锁算法的设计模式,在高竞争环境下表现出色。 原子类提供了诸如AtomicInteger这样的封装对象,它们可以在不依赖传统锁定机制的情况下完成自增和其他基本运算。 - **并发集合**:例如ConcurrentHashMap, CopyOnWriteArrayList等特殊数据结构,专为提高读取效率而优化,并且能够在写入时保持一致性。 它们内部实现了细粒度加锁或其他非阻塞技术,确保即使是在大量并发访问情况下也能维持良好的吞吐量。 #### 编码示例 下面是一个简单的例子展示了如何使用`Executors.newFixedThreadPool()` 创建固定大小的工作队列以及提交Runnable实例: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolExample { public static void main(String[] args) throws InterruptedException { // 创建具有两个线程的线程池 ExecutorService executor = Executors.newFixedThreadPool(2); Runnable taskOne = () -> System.out.println("Task One Executed"); Runnable taskTwo = () -> System.out.println("Task Two Executed"); // 提交任务到线程池中去执行 executor.submit(taskOne); executor.submit(taskTwo); // 关闭线程池 executor.shutdown(); } } ``` 此代码片段说明了怎样快速搭建起一个简易但功能完整的异步任务管理系统。 #### 最佳实践建议 为了充分利用Java并发API的优势并避免潜在的风险,应当注意以下几点: - 尽可能减少共享状态的数量;如果确实需要,则优先考虑不可变对象或局部变量。 - 对于可变的状态,采用适当的同步策略——既不过分保守也不过分激进。 - 利用现有的并发容器而非自己动手实现类似的轮子。 - 当涉及到长时间运行的操作时,请务必设置合理的超时参数以防止无限期挂起。 - 认真评估所选方案对于特定应用场景的有效性和适用范围。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值