3

ランナブルを数回実行しようとしていますが、x 秒以内に 3 回終了しない場合はキャンセルします。

タスクをキャンセルする必要がある状況をシミュレートするために使用しているコードは次のとおりです。出力から、InterruptedException がスローされ、それに応じてキャッチされたことがわかりますが、タスクは実行され続けます。

TimeoutException が 3 回スローされる前にタスクが実行された最初の 2 回のようです。これらの 2 回の実行は、終了するまで実行され続けました。これらの 2 つの実行が完了しないようにする方法があるかどうか疑問に思っています。

public class SomeClass {

private static int c =0;

public static void main(String[] args){
    Runnable dummyRunnable = new Runnable() {

        @Override
        public void run() {
            System.out.println("Hello from dummyRunnable!");        

                for (int i =0; i< 10; i++){
                    try {
                        //simulate work here
                        if (!Thread.currentThread().isInterrupted()) Thread.sleep(5000);
                        System.out.println("thread sleeps for the " + i + " time!");    
                    } catch (InterruptedException ie){
                        System.out.println("InterruptedException catched in dummyRunnable!");   
                        //Thread.currentThread().interrupt(); //this has no effects
                        break;

                    }
                }



        }
    }; 


    BlockingQueue<Runnable> blockingQueue = new ArrayBlockingQueue<Runnable>(10 * 3, true);
    ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 3, Long.MAX_VALUE, TimeUnit.MILLISECONDS, blockingQueue);

    for (int i =0; i< 5; i++){
        Future<?> task = executor.submit(dummyRunnable);

        try{
            Thread.sleep(1000);
            task.get(2000, TimeUnit.MILLISECONDS);
        } catch (TimeoutException te){
            c++;
            System.out.println("TimeoutException from a task!");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (c==3){
                System.out.println("cancelling task...");
                task.cancel(true);
                break;
            }
        }
    }
     }
}
4

1 に答える 1

0

あなたが実際にシミュレートしようとしていることはわかりません。カードでの支払い (タスクを完了するための 60 秒のタイムアウト) または医師と患者の状況での秘書のようなシミュレーションを期待します。

現状では、未来の 5 つのオブジェクトを作成しています。スレッドをより細かく制御したい場合は、同期されたメソッドと、スレッドを処理するモニターの使用を検討する必要があります。

通常、スレッドを開始するときは、

new Thread(new Task(object or generics)).start();
Thread.sleep(2000); // calls this thread to wait 2 secs before doing other task(s)

本格的な並行処理 (マルチスレッド) を実行する前に、Java チュートリアルを読んでインスピレーションを得る必要があります... http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html

于 2013-03-12T00:43:59.553 に答える