У меня есть следующий фрагмент кода для использования многопоточности java.Как я могу убедиться, что все потоки закончились до окончания основного потока?
ExecutorService threadExecutor = Executors.newFixedThreadPool(10);
while(resultSet.next())
{
name=resultSet.getString("hName");
MyRunnable worker = new Myrunnable(name);
threadExecutor.execute(worker);
Counter++;
}
threadExecutor.shutdown();
System.out.println("thread shutdown");
// Wait until all threads are finish
while (! threadExecutor.isTerminated()) {
}
System.out.println("Finished all threads");
}// end try
catch (Exception e) {
e.printStackTrace();
}
System.out.println("END MAIN");
DBConnection.con.close();
И функция запуска следующим образом:
//The constructor
MyRunnable (String name) {
this.name=name;
}
public void run()
{
myclass Obj=new myclass();
try {
Obj.myFunction(name);
} catch (Exception e) {
System.out.println("Got an Exception: "+e.getMessage());
}
System.out.println(" thread exiting.");
}
В предыдущих сообщениях, кто-то предложили следующий код, чтобы ждать резьбы до конца.
while (! threadExecutor.isTerminated()) {
try {
threadExecutor.awaitTermination(1, TimeUnit.SECOND);
}
catch (InterruptedException e) {
// you have to determine if someone can interrupt your wait
// for the full termination of the executor, but most likely,
// you'll do nothing here and swallow the exception, or rethrow
// it in a RuntimeException
}
}
Теперь я столкнулся с проблемой в обоих случаях. Если я использовал первый метод, моя программа запускается, но в конце он вводит бесконечный цикл, которому предшествуют все потоки, выходящие. Распечатка END MAIN никогда не появляется. Если я использовал второй метод, у меня появилась следующая ошибка с начала запуска программы, а также распечатка END MAIN никогда не появляется:
Получено исключение: после закрытия соединения никаких операций не разрешено. нить выходить.
Пожалуйста, сообщите мне, как сделать мой основной поток завершенным после того, как все дочерние потоки выйдут.
Цикл while может голодать планировщик, попробуйте поместить Thread.sleep (250) или Theead.yield в него – MadProgrammer
где поставить Thread.sleep (250) или Theead.yield? Не могли бы вы прояснить больше, так как я новичок в многопоточности. –
Извините, в цикле while, который вы используете, чтобы подождать, пока закончится другой поток. – MadProgrammer