これは私のコードです:
public static void main(String[] args) {
System.out.println("program started");
ExecutorService executor = Executors.newCachedThreadPool();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread finished");
}
});
executor.execute(thread);
try {
thread.join();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread joined");
}
私は起動したときにスレッドを上に示したように、thread.join()
仕事しない、それが終了するスレッドを待ちません。私は実行する必要がスレッドをすることによってExecutorServiceのも、そのスレッドが終了するのを待ちます。しかし、私のコードは良い動作しません。缶誰の助け私?
なぜ私が使用していない将来の代わりにスレッドを?
時々私は私の中断する必要があるため、スレッドをし、そのために待つスレッドが終了したと。しかし、私がキャンセルしたときに将来を、future.get()
例外を取得し、それのために待機していないスレッドが終了したと。
私の文章の文法が正しくない場合、私は事前にお詫び申し上げます。私はよく英語を話すことができないので。
単純な答え:それをしないでください。
このような抽象化の層を混在させないでください。エグゼキュータ・インターフェースはありませんexecute()
スレッド。それはとりランナブルを。それはあなたがそれにThreadオブジェクトを渡すことは重要ではありません、あなたのスレッドがへの呼び出し以外にも、すべてで使用されることはありませんrun()
方法。
抽象化されたエグゼキュータのサービスを「低レイヤ」裸の鉄のスレッドを混合すると、単純に悪い考えです。
その全体のポイントスレッドプールの概念は、あなたがないということであるではない根本的なスレッドをコントロールしよう。プールされたスレッドを待っているにはポイントだけではありません最後に。スレッドを確立する(比較的)コストのかかる操作であるため、スレッドプールは、周りのスレッドを維持します。彼らは終了しますが、上の住んでいないので、実行する他、将来的に仕事を。
ここに本当の答え:そのエグゼキュータのサービス、または(あなたが行くと側の低レベルのものをやっなし)というコンセプトで動作するソリューションの外観を使用していないのいずれか。
そして「本当の本当の」答え:ステップバック、そしてあなたが意図この方法を解決するために「本当」の問題について教えてください。