Я пытаюсь использовать два списка List TaskList для хранения задач, а затем отправлять их в пул потоков, но все потоки заблокированы и не могут обрабатывать новые запросы. Код такой:
Есть пул потоков.
Код: Выделить всё
public class AsyncInvoker {
public class AsyncInvoker {
private ExecutorService excutePool;
public AsyncInvoker(int thread, int queue) {
excutePool= new ThreadPoolExecutor(thread, thread,
0, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(queue), new ThreadPoolExecutor.AbortPolicy());
}
public InvokeCollection newCollection() {
return new InvokeCollection();
}
public class InvokeCollection {
private List taskList = new ArrayList();
public void add(Runnable task) {
CompletableFuture future = CompletableFuture.runAsync(task, excutePool);
taskList.add(future);
}
public void invokeAll() {
try {
CompletableFuture future = CompletableFuture.allOf(taskList.toArray(new CompletableFuture[0]));
future.get();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Код: Выделить всё
@RestController
public class TestController {
AsyncInvoker asyncInvoker = new AsyncInvoker(10,1000000);
@GetMapping("test")
public void test(){
System.out.println("request=======================");
AsyncInvoker.InvokeCollection outer = asyncInvoker.newCollection();
for (int i = 0; i < 10; i++) {
outer.add(()->{
AsyncInvoker.InvokeCollection inner = asyncInvoker.newCollection();
for (int j = 0; j < 100; j++) {
inner.add(()->{
try {
Thread.sleep(100);
System.out.println("===");
}catch (Exception e) {
e.printStackTrace();
}
});
}
inner.invokeAll();
});
System.out.println("i " + i);
}
outer.invokeAll();
}
}
Код: Выделить всё
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for (a java.util.concurrent.CompletableFuture$Signaller)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.CompletableFuture$Signaller.block(CompletableFuture.java:1707)
at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3334)
at java.util.concurrent.CompletableFuture.waitingGet(CompletableFuture.java:1742)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1908)
at com.aa.AsyncInvoker$InvokeCollection.invokeAll(AsyncInvoker.java:59)
а также, если я использую частный ForkJoinPool forkJoinPool = new ForkJoinPool(thread,new SafeForkJoinWorkerThreadFactory(), null, false); для обработки задач, это также выглядит хорошо.
Поэтому я не знаю, почему написанный выше код не работает, поток заблокирован, почему? и почему в этом случае ForkJoinPool лучше, чем ThreadPoolExecutor.
Может ли кто-нибудь мне помочь? Спасибо большое!!!
Подробнее здесь: https://stackoverflow.com/questions/787 ... e-tasklist
Мобильная версия