JDK1.7之后出来的,并行执行任务,提高效率,大数据量!
ForkJoin特点:工作窃取
里面维护的都是双端队列
ForkJoin的操作
求和运算 代码示例:
测试代码:
在Java的Fork/Join框架中,`fork()`和`submit()`都是用于提交任务的方法,但它们有一些区别。
1. `fork()`方法是ForkJoinTask类中的方法,用于将任务分解为更小的子任务,并将子任务提交给ForkJoinPool进行执行。它是一种无返回值的任务提交方式,表示当前任务将被划分为更小的子任务并在ForkJoinPool中执行。`fork()`方法会立即返回,不等待子任务的执行结果。
2. `submit()`方法是ExecutorService接口中的方法,用于提交任务并返回一个表示任务执行结果的Future对象。它可以用于提交任何实现了Callable或Runnable接口的任务。`submit()`方法会返回一个Future对象,可以通过该对象获取任务的执行结果。
总的来说,`fork()`方法用于提交ForkJoinTask任务,并将任务划分为更小的子任务,不等待子任务的执行结果;而`submit()`方法用于提交任务并获取任务的执行结果,可以用于提交任何实现了Callable或Runnable接口的任务。
以下是使用`fork()`和`submit()`方法的示例代码:
```java
ForkJoinPool forkJoinPool = new ForkJoinPool();
MyTask task = new MyTask();
forkJoinPool.invoke(task); // 使用fork()提交任务
Callable<Integer> callable = new MyCallable();
Future<Integer> future = forkJoinPool.submit(callable); // 使用submit()提交任务并获取结果
int result = future.get(); // 获取任务的执行结果
```
在上面的示例中,首先创建了一个ForkJoinPool对象,然后使用`invoke()`方法提交了一个ForkJoinTask任务,并使用`submit()`方法提交了一个Callable任务。对于ForkJoinTask任务,它会使用`fork()`方法将任务划分为更小的子任务并在ForkJoinPool中执行;对于Callable任务,它会使用`submit()`方法提交任务并返回一个Future对象,然后可以通过Future对象的`get()`方法获取任务的执行结果。
在ForkJoin框架中,fork和submit方法都用于提交任务,但它们之间存在一些关键的区别。
fork方法会将一个任务拆分成多个子任务,并将这些子任务加入到ForkJoin线程池中等待执行。当一个子任务被执行时,它会将结果提交给父任务,父任务会继续执行并等待其他子任务的结果。因此,fork方法用于将一个任务拆分成多个子任务并行执行,并将结果合并。
而submit方法是将一个任务提交给ForkJoin线程池执行,但不关心任务的执行结果。当任务被提交后,它会被加入到一个队列中等待执行。当一个工作线程空闲时,它会从队列中窃取一个任务并执行。因此,submit方法适用于只需要异步执行一个任务的情况,而不需要关心任务的执行结果。
总结来说,fork和submit的主要区别在于:fork方法用于将一个任务拆分成多个子任务并行执行,并将结果合并;而submit方法是将一个任务提交给线程池异步执行,不关心任务的执行结果。