2013-02-26 2 views
0

Я понимаю, что метод future.get() является блокирующим. У меня есть простой класс, который представляет задачи в цикле for, каждая задача печатает название темы. Когда я использую Executors.newCachedThreadPool() и future.get() в цикле, насколько я понимаю, каждый цикл является синхронным потоком, и исключение исключений TimeOut не должно быть. Но я заметил это исключение. Может кто-то предположить, почему это происходит.Исключение таймаута с использованием future.get() - Java ThreadPools

Код выглядит следующим образом:

public class AsynchronusExecutorTest { 

private static ExecutorService executor = null; 

static { 
    executor = Executors.newCachedThreadPool(); 
    System.out.println("New executor"); 
} 

public static void main(String[] args) { 
    for (int i = 0;; i++) { 
     final Future<?> future = executor.submit(new MyRunnable3("Thread" + i)); 
     try { 
      future.get(1, TimeUnit.SECONDS); 
      System.out.println("Thread returns"); 
     } catch (Exception e) { 
      System.out.println("Time out occured Exception: " + e); 
      e.printStackTrace(); 
      future.cancel(true); 
     } 
    } 
} 
} 

class MyRunnable3 implements Runnable { 
String name; 

public MyRunnable3(String name) { 
    this.name = name; 
} 
@Override 
public void run() { 
    System.out.println("This is test " + name); 
    if (name.equals("Thread0")) { 
     for (;;) { 

     } 
    } 
} 

} 

ответ

0

После кода никогда не вернется if (name.equals("Thread0")):

if (name.equals("Thread0")) { 
    for (;;) { 

    } 
} 

И вы передаете "Thread0", когда я == 0:

for (int i = 0;; i++) { 
    final Future<?> future = executor.submit(new MyRunnable3("Thread" + i)); 
    //... 
} 

Возможно, вы захотите изменить for (int i = 0;; i++) на for (int i = 1;; i++).

Смежные вопросы