2

ランナブルを追跡するために、スレッドのマップと関連するランナブル オブジェクトを使用しています。がスローされたときの背後にある目的interruptedExceptionは、現在のスレッドとその実行可能なオブジェクトにアクセスすることです。

Map<Thread, Runnable> myMap = new Map<Thread, Runnable>();
ExecutorService pool = Executors.newFixedThreadPool(5);
pool.execute(new myRunnable());

しかし、ランナブルをスレッド プールに追加するときに、マップを埋める方法が思い浮かびません。

Thread とその実行可能なオブジェクトを含むマップにエントリを追加するにはどうすればよいですか?

4

4 に答える 4

3

ThreadPoolExecutor のフック メソッドを使用できます。

    final Map<Runnable, Thread> map = new ConcurrentHashMap<Runable, Thread>();
    ExecutorService pool = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()) {
        @Override
        protected void beforeExecute(Thread t, Runnable r) {
            map.put(r, t);
        }

        @Override
        protected void afterExecute(Runnable r, Throwable t) {
            map.remove(r);
        }
    };
于 2013-06-06T13:14:02.460 に答える
3

あなたは間違った角度からそれに近づいています。スレッドに送信すると、作業が完了したという印象を受けるはずです。発生した中断は、実行中のスレッドによって処理される必要があります。

例えば

public void run(){
    try{
      //do some work that responds to interruption
    }catch(InterruptedException ex){
       //clean up
    }
}

または

public void run(){
    if(Thread.currentThread().isInterrtuped()){
        //clean up
        return;
    }
]
于 2013-06-06T13:16:10.530 に答える