0

future.get()それがブロッキング方法であることは理解しています。forループでタスクを送信する単純なクラスがあり、各タスクはスレッドの名前を出力します。Executors.newCachedThreadPool()andをループで使用する場合future.get()、各ループが同期フローであり、TimeOut 例外のスコープがないことを理解する限り。しかし、この例外が来ることに気づきました。なぜこれが起こっているのか誰かが示唆できますか?

コードは次のとおりです。

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 (;;) {

        }
    }
}

}
4

1 に答える 1

0

次のコードは決して返されませんif (name.equals("Thread0"))

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

    }
}

そして、i ==0のときに「Thread0」を渡します。

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

に変更for (int i = 0;; i++)することをお勧めしfor (int i = 1;; i++)ます。

于 2013-02-26T09:15:34.663 に答える