Служба-исполнитель: SingleThreadExecutor не запускает исполняемый объект

#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 ). Приложение не может завершить работу, пока этот поток не остановится.