使用FutureTask可以返回当前线程的结果。
可以让线程阻塞或者是唤醒
LockSupport与Wait/notify
public class MayiktTask<V> implements Runnable { private MyCallable<V> myCallable; private V result; private Thread cuThread; public MayiktTask(MyCallable myCallable) { this.myCallable = myCallable; } @Override public void run() { result = myCallable.call(); LockSupport.unpark(cuThread); } public V get() { if (result != null) { return result; } cuThread = Thread.currentThread(); LockSupport.park(cuThread); return result; } } MayiktTask<String> stringMayiktTask = new MayiktTask<>(new Test002()); new Thread(stringMayiktTask).start(); String s = stringMayiktTask.get(); System.out.println(s);
Java 1 支持thread,synchronized。
Java 5 引入了 thread pools, blocking queues, concurrent collections,locks, condition queues。
Java 7 加入了fork-join库。
Java 8 加入了 parallel streams。 并行流:
Fork/Join是Java7提供的并行执行任务的框架,是一个把大任务分割成若干小任务,最终汇总小任务的结果得到大任务结果的框架
小任务可以继续不断拆分n多个小任务。
if(任务很小){
直接计算得到结果
}else{
分拆成N个子任务
调用子任务的fork()进行计算
调用子任务的join()合并计算结果
}
将一个比较大的任务,拆分成n多个不同的子任务,一直到不可以拆分为止。
例如:将一个大的任务,拆分成n多个子任务,每个任务中对应一个独立的队列。
由于每个线程处理的速度不一样,如果先执行完任务的队列的线程,窃取其他没有
执行完任务队列。
1、RecursiveAction:用于没有返回结果的任务
2、RecursiveTask:用于有返回结果的任务
Compute()方法计算
Fork()方法 Fork()方法类似于Thread.start(),但是它并不立即执行任务,而是将任务放入工作队列中,拆分子任务。
join()合并子任务 支持Join,即任务结果的合并
通过invoke方法提交的任务,调用线程直到任务执行完成才会返回,也就是说这是一个同步方法,且有返回结果;
通过execute方法提交的任务,调用线程会立即返回,也就是说这是一个异步方法,且没有返回结果;
通过submit方法提交的任务,调用线程会立即返回,也就是说这是一个异步方法,且有返回结果(返回Future实现类,可以通过get获取结果)。
使用Fork join计算 总和
public class ForkJoinDemo extends RecursiveTask<Long> { // 最小分隔单位 private long max = 200; private long start; private long end; public ForkJoinDemo(Long start, Long end) { this.start = start; this.end = end; } @Override protected Long compute() { Long sum = 0l; if (end - start < max) { System.out.println(Thread.currentThread().getName() + ",start:" + start + ",end:" + end); for (Long i = start; i <= end; i++) { sum += i; } } else { // 400+1 200 1-200,201-400 long l = (end + start) / 2; ForkJoinDemo left = new ForkJoinDemo(start, l); left.fork(); ForkJoinDemo rigt = new ForkJoinDemo(l + 1, end); rigt.fork(); left.join(); rigt.join(); try { sum = left.get() + rigt.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } return sum; } public static void main(String[] args) throws ExecutionException, InterruptedException { ForkJoinPool forkJoinPool = new ForkJoinPool(); ForkJoinDemo forkJoinDemo = new ForkJoinDemo(1l, 400l); ForkJoinTask<Long> submit = forkJoinPool.submit(forkJoinDemo); System.out.println(submit.get()); } }
每一行代码都有它的涵义,多问一句为什么;别怕,理清思路,一切代码都是数据的流动和转化,耐心一点,慢慢积累!一起加油!!!