2

以下はサンプルプログラムです。Thread.sleep のコメントを外すと、正常に動作します。ただし、Call メソッド内に記述されたコードにかかる時間が不明な場合は、無限の時間になる可能性があります。または、Call メソッド内の DB 接続ロジックに時間がかかり、強制終了する必要がある悪いプログラムである可能性があります。

thread.sleep にコメントを付けると以下のコードが機能しない理由と、Thread.interrupted 条件を書き込まずにそれを強制終了して停止する方法を教えてください。(Callメソッド内にロジックを書き込む権限がないと仮定します)

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class stopThreadTest {

    public static void main(String[] args) {

        java.util.concurrent.ExecutorService executor = null;
        Future a1 = null;

        try {
            executor = java.util.concurrent.Executors.newFixedThreadPool(4);
            a1 = executor.submit(new java.util.concurrent.Callable() {
                public String call() throws Exception {
                    int i = 0;
                    while (true) {
                        //Thread.sleep(100);
                        // System.out.println("hello");
                        if (i > 10)
                            break;
                    }
                    return null;
                }
            });

            // Wait until all threads are finish
            /*
             * while (!executor.isTerminated()) { }
             */
            System.out.println("Calling PartialOrFullSuccessCheck");

            try {
                boolean isThreadError = (a1 != null) ? ((a1.get(2,
                        TimeUnit.SECONDS) == null) ? false : true) : false;

            } catch (TimeoutException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

                // interrupts the worker thread if necessary
                System.out
                        .println("Cancelled" + a1.isDone() + a1.isCancelled());
                a1.cancel(true);

                System.out.println("encountered problem while doing some work");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

                // interrupts the worker thread if necessary
                System.out
                        .println("Cancelled" + a1.isDone() + a1.isCancelled());
                a1.cancel(true);
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

                // interrupts the worker thread if necessary
                System.out
                        .println("Cancelled" + a1.isDone() + a1.isCancelled());
                a1.cancel(true);
            }

        } finally {
            System.out.println("ShutDown Executor");
            executor.shutdown();
        }
    }
}
4

1 に答える 1

2

スレッドの協力なしにスレッドを安全に停止する方法はありません。スレッドを使用すると、割り込みを受けるか、共有変数の値を定期的にチェックするか、またはその両方を行うことで、他のスレッドがスレッドを停止できます。それ以外で唯一安全なのは、JVM (プロセス全体) をシャットダウンすることです。この投稿は非常に詳細です:

Javaでスレッドをどのように強制終了しますか?

于 2012-06-01T23:31:11.907 に答える