并发执行框架

FutureTask

单线程执行框架。
获得线程执行的返回值。
FutureTask
Callable包装成FutureTask,传入Thread对象中(继承了Runnable),start启动线程,然后通过Future接口的get()拿到返回值。

Callable<Object> callable = new Callable<>(){
	@Override
	public Object call() {
		Object obj = new Object();
		// ...
		reutrn obj;
	}
}
FutureTask<Object> future = new FutureTask<>(callable);
Thread thread = new Thread(future);
Object res = future.get();

ForkJoinPool

多线程执行框架。
拆分任务。分治思想,工作密取。
ForkJoinPool
分治:

Fork/Join
工作密取指的是:一个线程完成了自己的任务,可以去帮助其他线程完成任务。

	ForkJoinPool pool = new ForkJoinPool();
	// 有返回值的 task
	ForkJoinTask<Object> task = new MyTask<>();
	pool.invoke(task); // 阻塞
	// pool.execute(task); // 异步
	Object res = task.join(); // 阻塞等待任务执行完并返回结果
	ForkJoinPool pool = new ForkJoinPool();
	// 无返回值的 action
	ForkJoinTask<Object> action = new MyAction<>();
	pool.invoke(action); // 阻塞
	// pool.execute(task); // 异步
	action.join();// 阻塞等待任务执行完

ForkJoinTask 提供了两个常用实现类(递归实现):

	public abstract class RecursiveTask<V> extends ForkJoinTask<V>
	public abstract class RecursiveAction extends ForkJoinTask<Void> // Void 无返回值

所以只需继承他们就好了

	public MyTask<V> extends RecursiveTask<V> {
		@Override
		public V compute() {
			// ... 提交子任务 invoke(new MyTask<>()); ... invokeAll(myTasks);
			// ... 等待子任务完成再返回 res = myTask1.join() + myTask2.join() ... 
			return null;
		}
	}

	public MyAction<V> extends RecursiveAction<V> {
		@Override
		public void compute() {
			// ... 提交子任务 invoke(new MyAction<>()); ... invokeAll(myActions);
			// 等待子任务完成再结束 foreach action.join();
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值