Весь поток заблокирован в пуле при обработке нескольких списков задачJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Весь поток заблокирован в пуле при обработке нескольких списков задач

Сообщение Anonymous »

У меня возникли некоторые проблемы при использовании ThreadPoolExecutor, и я не могу их понять.
Я пытаюсь использовать два списка 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();
}
}
Когда я запрашиваю TestController несколько раз, в консоли idea появляется несколько отпечатков ===, и, поскольку я запрашиваю повторно, == больше нет = печатает. Я думаю, что ветка заблокирована. Дамп треда такой:

Код: Выделить всё

   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)
И затем, если есть только один AsyncInvoker.InvokeCollection вместо внешнего и внутреннего, и я добавляю все задачи в одну коллекцию, это работает хорошо.
а также, если я использую частный ForkJoinPool forkJoinPool = new ForkJoinPool(thread,new SafeForkJoinWorkerThreadFactory(), null, false); для обработки задач, это также выглядит хорошо.
Поэтому я не знаю, почему написанный выше код не работает, поток заблокирован, почему? и почему в этом случае ForkJoinPool лучше, чем ThreadPoolExecutor.
Может ли кто-нибудь мне помочь? Спасибо большое!!!

Подробнее здесь: https://stackoverflow.com/questions/787 ... e-tasklist
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»