Отправка вызываемого объекта внутри вызываемого объекта в службу исполнителя приводит к зависанию программы.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Отправка вызываемого объекта внутри вызываемого объекта в службу исполнителя приводит к зависанию программы.

Сообщение Anonymous »

В настоящее время я использую фиксированный пул для разделения большой задачи; все это работает нормально. Однако; Теперь я обнаружил, что часть одной из этих задач сама по себе может быть подразделена. Раньше я пытался отправить дополнительные вызовы в фиксированный пул, но программа зависала на Future#get() (отмечено в коде)

Следующая программа повторяет проблему (я использовал фиксированный пул размера 1, чтобы усугубить проблему)

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

public class ThreadPoolTest {
static ExecutorService threadPool=Executors.newFixedThreadPool(1);

//method run by inner callable
public void printText(){
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(ThreadPoolTest.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Printed from within thread");
}

//method run by outer callable
public void testThreadPool(){

Callable printOnAThread=()->{printText(); return null; };

Future f2=threadPool.submit(printOnAThread);

try {
System.out.println("Called");
f2.get(); //{t.testThreadPool();return null;};

Future f=threadPool.submit(
testCallable
);

try {
f.get();
} catch (InterruptedException | ExecutionException ex) {
Logger.getLogger(ThreadPoolTest.class.getName()).log(Level.SEVERE, null, ex);
throw new RuntimeException("Main thread failed", ex);
}
}

public static void main(String[] args){
testThreadWithinThread();
threadPool.shutdown();
System.out.println("Program exits");
}
}
Чего я ожидал
  • Первая тема отправлена. testThreadWithinThread() выполняется
  • Код: Выделить всё

    testThreadWithinThread()
    отправляет вызываемый объект (

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

    ()->{t.testThreadPool();return null;};
    )
  • Отправленный вызываемый объект начинает работать «немедленно»
  • t.testThreadPool(); начинает работать
  • Код: Выделить всё

    testThreadPool();
    сам отправляет внутренний вызываемый объект ()->{printText(); вернуть ноль; };
  • Внутренний вызываемый объект еще не может быть запущен, поскольку пул потоков несвободен
  • Код: Выделить всё

    f.get();
    достигнут, внешний вызываемый блокируется и ждет. Это освобождает поток в фиксированном пуле.
  • Внутренний вызываемый объект теперь выполняется до завершения.
  • Код: Выделить всё

    f2.get();
    больше не блокируется, внешний вызываемый объект выполняется до завершения.
Что произошло на самом деле

Шаги 1–6 происходят, как я и ожидал, однако в точке 7, когда внешний вызываемый объект блокируется; по какой-то причине поток не освобождается и программа зависает.

Вопрос

Почему программа зависает на этом этапе? Есть ли способ безопасно отправлять вызываемые объекты из вызываемых объектов?

Подробнее здесь: https://stackoverflow.com/questions/236 ... the-progra
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему использование ProcessBuilder.start приводит к зависанию программы? [дубликат]
    Anonymous » » в форуме JAVA
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • LD_PRELOAD на Android приводит к зависанию приложения
    Anonymous » » в форуме Android
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • Инициализация кадра данных Polars с 15 миллионами записей приводит к зависанию машины.
    Anonymous » » в форуме Python
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Сохранение PDF-документа с помощью PDFBox приводит к бесконечному зависанию
    Anonymous » » в форуме JAVA
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Использование Ironpython из C# async-await приводит к зависанию приложения
    Anonymous » » в форуме C#
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous

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