package cn.com;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;
import java.util.concurrent.atomic.LongAdder;
import org.junit.Before;
import org.junit.Test;
public class FileTest {
ExecutorService newFixedThreadPool;
ForkJoinPool fjp;
@Before
public void initalMethod() {
int nThreads = Runtime.getRuntime().availableProcessors();
this.newFixedThreadPool = Executors.newFixedThreadPool(nThreads);
fjp = new ForkJoinPool();
}
/**
* 测试提交多个带有返回值的任务
* @throws FileNotFoundException
* @throws InterruptedException
* @throws ExecutionException
*/
@Test
public void testFile1() throws FileNotFoundException, InterruptedException, ExecutionException {
// 添加任务
List<Mytasks> tasks = new ArrayList<Mytasks>();
tasks.add(new Mytasks());
tasks.add(new Mytasks());
tasks.add(new Mytasks());
tasks.add(new Mytasks());
tasks.add(new Mytasks());
List<Future<Long>> res = newFixedThreadPool.invokeAll(tasks);
LongAdder la = new LongAdder();
for (int i = 0, size = res.size(); i < size; i++) {
la.add(res.get(i).get());
}
System.out.println(la.sum());
}
}
class Mytasks implements Callable {
LongAdder la = new LongAdder();
@Override
public Long call() throws Exception {
for (int i = 0; i < 999999; i++) {
la.increment();
}
return la.sum();
}
}
class MyTasksB extends RecursiveTask {
private static final long serialVersionUID = 1L;
ConcurrentLinkedQueue<Integer> clq;
public MyTasksB(ConcurrentLinkedQueue<Integer> clq) {
super();
this.clq = clq;
}
@Override
protected Integer compute() {
if (clq.size() > 10000) {
MyTasksB forkJob = new MyTasksB(clq);
forkJob.fork();
}
return null;
}
}