2

私は2つのクラスを持っています。クラスAでは、run()メソッドを永久にループさせますが、クラスBではスレッドプールを使用します。

私の質問は、クラスから、クラスでメソッドをB実行するスレッドを制御および停止するにはどうすればよいですか、強制シャットダウンを試しましたが、機能していません。ループは永遠に続くようです。run()AthreadExecutor.shutdownNow()

コードの例を次に示します。


public class A implements Runnable {
    public void run() {
        while (true) {
            System.out.println("Hi");
        }
    }
}

public class B {
    public static void main(String[] args) {
        int noOfThreads = 1;
        A ThreadTaskOne = new A();
        System.out.println("Threads are being started from Class B");
        ExecutorService threadExecutor = Executors.newFixedThreadPool(noOfThreads);
        threadExecutor.execute(ThreadTaskOne);
        threadExecutor.shutdownNow();
        System.out.println("B Ends, no of threads that are alive : " + Thread.activeCount());
    }
}
4

3 に答える 3

1

@MadProgammerが言ったように、「無限」ループはThread.isInterruptedに注意を払う必要があります。例(非常に概略的)

public void run() {

   while (!Thread.isInterrupted()) {
      doSomethinginTheLoop1();
      blah...blah...blah
      // if the loop is very long you might want to check isInterrupted 
      // multiple times for quicker termination response
      doSomethingInTheLoop2();
   }

   // now, here's a decision of what you do
   // do you throw an InterruptedException or trust others to check interrupted flag.
   // read Java COncurrency in Practice or similar...
}
于 2012-10-17T00:20:22.820 に答える
1

ドキュメントにExecutorService#shutdownNow()は次のように書かれています -

アクティブに実行中のタスクの処理を停止するための最善の努力以外の保証はありません。たとえば、典型的な実装は Thread.interrupt() によってキャンセルされるため、割り込みに応答しないタスクは決して終了しない可能性があります。

そして、あなたのスレッドは、中断されても気にしないようです。

中断されていないか確認してください

while (Thread.currentThread().isInterrupted())

ただするのではなく

while (true)
于 2012-10-17T00:27:43.610 に答える
0

以下はあなたに役立つかもしれません。

public static class A implements Runnable {
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            System.out.println("Hi");
        }
    }
} 
于 2012-10-17T02:28:55.103 に答える