#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
этого достаточно для того, что вы пытаетесь сделать, тогда обязательно.