почему newsinglethreadexcutor блокирует текущий поток?

#java #multithreading

#java #многопоточность

Вопрос:

Я пытаюсь понять, почему newsinglethreadexecutor с get() помощью метода вызываемых фьючерсов блокируется binderthread то, в котором он инициализирован. Как я могу заставить их работать вместе?

 public class main  {

    public static void main(String[] args) {
        final process prc = new process();

        prc.run();

        System.out.println("main thread"   Thread.currentThread().getName());

    }


};
 

,,

 import java.util.concurrent.*;

public class process  {
    ExecutorService es = Executors.newSingleThreadExecutor();

    public void run() {

        Future fut = es.submit(new Callable<String>() {
            public String call() throws Exception {
                for (byte b : new byte[]{1,2,3,4,4}){
                    System.out.println(b Thread.currentThread().getName());
                    Thread.sleep(2000);
                }

                return "aa";
            }
        });


        try {
         //   System.out.println(fut.get(1900L, TimeUnit.MILLISECONDS));
            System.out.println(fut.get());
        }catch (Exception a){}
    }


}
 

Комментарии:

1. Ваш вопрос не имеет смысла. В an нет get метода ExecutorService . Вы имеете в виду get метод Future<?> , который был возвращен после отправки задачи в ExecutorService ? Это блокируется, потому что целью get является доступ к результату отправленной задачи, который вы не можете получить, пока задача не будет завершена.

2. да, я отредактирую, это было вызываемое future блокирует, поэтому get блокирует каждый поток в приложении или блокирует какие потоки?

3. get заблокирует поток, который вызывает get . (Косвенно, единственный ваш поток ExecutorService будет занят выполнением задачи — или он будет помещен в очередь для обработки позже. Хотя это не «заблокировано» и не вызвано get вызовом, это другой поток, который не может делать что-то еще.) Все остальные потоки в вашем приложении не должны быть затронуты (они могут быть заблокированы из-за других факторов, но на них не влияет get вызов).

4. но binderthread, который был eservice. при запуске, если get() не имеет тайм-аута, этот поток не продолжается, поместите get() в основную функцию, а после нее поместите system.outprint () вы увидите, что метод основных функций после get() никогда не вызывается (или после завершения режима ожидания потока обычно продолжается),

5. Да, хотя вы не можете использовать результат из него (не записывая его куда-то еще). Это Future дает вам доступ к "aa" тому, что возвращает ваша задача. Но если execute этого достаточно для того, что вы пытаетесь сделать, тогда обязательно.