如何跟踪java线程池中的可运行程序?

ui7jx7zq  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(332)

我正在使用线程和相关的runnable对象的Map来跟踪runnable。这背后的目的是什么 interruptedException 如果抛出,我想访问当前线程及其可运行对象。

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

但是当我将runnable添加到线程池时,我想不出一种方法来填充Map。
如何将一个条目添加到包含线程及其可运行对象的Map中?

pcrecxhr

pcrecxhr1#

可以使用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);
        }
    };
46qrfjad

46qrfjad2#

你从错误的Angular 接近它。一旦你屈服于线程你应该在印象中,你的工作已经完成。发生的任何中断都应由执行线程处理。
例如

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;
    }
]
carvr3hs

carvr3hs3#

executorservice背后的思想是从正在使用的线程中抽象出来。你可以重写myrunnable来泄露信息。
所以你会打电话

pool.execute(new myRunnable(myMap));

然后在myrunnable中,让构造函数保存对mymap的引用并添加

myMap.put(this,originalRunnableObject)

到run方法-其中originalrunnableobject是对此的已保存引用。当然,您需要您的Map是一个并发Map(您不能像您试图做的那样示例化Map接口)。
然而,有人不得不问,为什么你首先要这么做,就像我说的,执行者应该给出一个抽象层,你似乎想颠覆它。

ruoxqz4g

ruoxqz4g4#

// Map might cause concurrent modifications, Queue may be a better choice.
    final BlockingQueue<Pair<Thread, Runnable>> interruptedRunnable = new LinkedBlockingDeque<>(0);
    threadPool.execute(new Runnable() {
        @Override
        public void run() {
            try {
                // TODO do something here?

                if (Thread.interrupted()) {
                    interruptedRunnable.add(Pair.of(Thread.currentThread(), this));
                    return;
                }
            } catch (InterruptedException _) {
                interruptedRunnable.add(Pair.of(Thread.currentThread(), this));
            }
        }
    });

    // TODO polling ...
    while (true) {
        try {

            // TODO adjust timeout
            Pair<Thread, Runnable> x = interruptedRunnable.poll(1, TimeUnit.MINUTES);

            if (null != x) {
                // check x.
            }
            // TODO
        } catch (InterruptedException _) {
         break;   
        }
    }

相关问题