0

ExecutorServiceスレッドごとにタイムアウトまたは割り込みを提供できる実装を作成しようとしています。

以下の例では、スポーンしていると2 threadsします (実際のシナリオでは、この数は高くなりますeach thread) 10 minutes。つまり、Thread1 will run for 10 minutesThread2 will run for 10 minutes as well. 10 分が経過した場合は、スレッドを中断するか、タイムアウトする必要があります。

以下は私がこれまでに持っているコードであり、このinterrupt or timeout機能をここにきれいな方法で追加する方法を理解できないためno of threads、コードでこのパラメーターを構成可能にすると、そこでも適切に機能するはずです。

public static void main(String[] args) {

    final int noOfThreads = 2;
    final long exp_time_millis = 600000; //10 minutes

    //create thread pool with given size 
    ExecutorService service = Executors.newFixedThreadPool(noOfThreads);


    for (int i = 0, i< noOfThreads; i++) {
        service.submit(new ThreadTask());
    }
}


class ThreadTask implements Runnable {

    @Override
    public void run() {

        while(true) {
            System.out.println("Thread running...");
            try {

        /* make a select sql to the database 
         * and measure how much time it is taking in 
         * returning the response
         */

            } catch (InterruptedException e) {

            }
        }
    }
}

どんな提案でも大いに役立ちます。

SO に関する記事はほとんど見たことがありませんが、シナリオに一致するものを見つけることができず、簡単に実装できます。

更新されたコード:-

以下のコードを試していますが、run メソッドの catch ブロックでエラーが発生します。私が何か間違ったことをしているかどうかはわかりません。誰でも私を助けることができますか?

public class ThreadTimeout {

    public static void main(String[] args) {

        final int noOfThreads = 2;

        //create thread pool with given size 
        ExecutorService service = Executors.newFixedThreadPool(noOfThreads);

        ScheduledExecutorService scheduleService = Executors.newScheduledThreadPool(noOfThreads);
        for (int i = 0; i< noOfThreads; i++) {
            final Future future = service.submit(new ThreadTask());
            scheduleService.schedule(new Runnable(){
                public void run(){
                    future.cancel(true);
                }
            }, 10, TimeUnit.MINUTES);
        }
    }
}

class ThreadTask implements Runnable {

    @Override
    public void run() {

           //make a database connection

        while (true) {
            System.out.println("Thread running...");
            try {
                /*
                 * make a select sql to the database and measure
                 * how much time it is taking in returning the
                 * response
                 */
            } catch (InterruptedException e) {

            }
        }
    }
}
4

2 に答える 2

1

秒を使用することをお勧めしScheduledExecutorServiceます。Future元の送信から返された を に送信しScheduledExecutorServiceてキャンセルすることができます。

ScheduledExecutorService scheduleService =   Executors.newScheduledThreadPool(n);
for (int i = 0, i< noOfThreads; i++) { 
   final Future future = service.submit(new ThreadTask());
   scheduleService.schedule(new Runnable(){
       public void run(){
           future.cancel(true);
       }
  }, 10, TimeUnits.MINUTES);
}

ここで、ThreadTask中断に対応する必要があります。そうしないと、これは役に立ちません。

于 2013-02-25T02:55:11.527 に答える
0

私がお勧めするのは、ExecutorService.awaitTermination(...);メソッドを使用してからメソッドを使用するExecutorService.shutdownNow()ことです。

例えば:

for (int i = 0; i < noOfThreads; i++) {
    service.submit(new ThreadTask());
}
// we always need to shutdown the service _after_ we've submitted all jobs
service.shutdown();
// now we wait for those tasks to finish for 10 minutes
if (!service.awaitTermination(10, TimeUnit.MINUTES)) {
    // if we timed out waiting for the tasks to finish, forcefully interrupt them
    service.shutdownNow();
}

これはスレッドを中断しますがThread.sleep()、 、Object.wait()、および他のいくつかのメソッドが をスローするだけであることに注意してくださいInterruptedException。また、 でテストできるスレッドに割り込みビットを設定しThread.currentThread().isInterrupted()ます。UNIXプロセスのようにスレッドを「殺す」ことはありません。

于 2013-02-25T02:47:32.167 に答える