#java #concurrency #executorservice
#java #параллелизм #executorservice
Вопрос:
Я пытаюсь выполнить исполняемый объект, используя пакет параллелизма Java, ExecutorService SingleThreadExecutor. Когда я вызываю команду execute a для нового выполняемого объекта, она просто переступает через нее. т. е. метод run() не вызывается.
Я прошелся по своим строкам кода с помощью отладчика и вижу, что мой SingleThreadExecutor создан и мой Runnable инициализирован.
public class RunnableDemo {
public ExecutorService executor;
public RunnableDemo () {
this.executor = Executors.newSingleThreadExecutor();
}
public void start(){
executor.execute(new MyRunnable("Hello World"));
}
public static void main(String[] args){
RunnableDemo app = new RunnableDemo();
app.start();
}
}
public class MyRunnable implements Runnable {
private String strToPrint;
public MyRunnable(String parameter) {
this.strToPrint = parameter;
}
public void run() {
System.out.println(strToPrint);
}
}
И, вероятно, это не требует пояснений, но в этом сценарии я бы ожидал увидеть вывод «Hello World» на экран. Однако, метод execute / run, похоже, не вызывается после создания выполняемого объекта.
Комментарии:
1. Ваш код не компилируется, поскольку у вашего конструктора есть подпись,
public runnableDemo()
хотя имя вашего классаRunnableDemo
. Кроме того, конструкторMyRunnable
принимаетSting
вместоString
.2. После исправления ошибки компиляции, упомянутой в комментарии выше, ваш код работает нормально.
3. После редактирования он работает нормально.
Ответ №1:
Ваша программа завершается до того, как исполнитель запустит задачу.
Вы должны дождаться завершения работы исполнителя следующим образом:
public class RunnableDemo {
public ExecutorService executor;
public RunnableDemo () {
this.executor = Executors.newSingleThreadExecutor();
}
public void start(){
executor.execute(new MyRunnable("Hello World"));
}
public void awaitTermination(){
try {
service.awaitTermination(10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args){
RunnableDemo app = new RunnableDemo();
app.start();
app.awaitTermination();
}
}
public class MyRunnable implements Runnable {
private String strToPrint;
public MyRunnable(String parameter) {
this.strToPrint = parameter;
}
public void run() {
System.out.println(strToPrint);
}
}
Комментарии:
1.
ThreadPoolExecutor
ВозвращаемыйnewSingleThreadExecutor
создает и запускает поток, не являющийся демоном, как только задача отправлена (здесь с помощьюexecute
). Приложение не может завершить работу, пока этот поток не остановится.