覆盖线程池中线程的中断方法
Override interrupt method for thread in threadpool
假设我有这个:
class Queue {
private static ExecutorService executor = Executors.newFixedThreadPool(1);
public void use(Runnable r){
Queue.executor.execute(r);
}
}
我的问题是 - 如何定义池中使用的线程,特别是想覆盖池中线程的中断方法:
@Override
public void interrupt() {
synchronized(x){
isInterrupted = true;
super.interrupt();
}
}
通过指定 ThreadFactory
.
定义如何为池创建线程
Executors.newFixedThreadPool(1, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r) {
@Override
public void interrupt() {
// do what you need
}
};
}
});
当然,ThreadFactory
可以用 lambda 表达式表示。
ThreadFactory factory = (Runnable r) -> new YourThreadClass(r);
如果线程不需要额外设置(比如将其设为守护进程),您可以使用方法引用。不过,构造函数 YourThreadClass(Runnable)
应该存在。
ThreadFactory factory = YourThreadClass::new;
我建议阅读 ThreadPoolExecutor
and Executors
的文档。他们提供的信息非常丰富。
假设我有这个:
class Queue {
private static ExecutorService executor = Executors.newFixedThreadPool(1);
public void use(Runnable r){
Queue.executor.execute(r);
}
}
我的问题是 - 如何定义池中使用的线程,特别是想覆盖池中线程的中断方法:
@Override
public void interrupt() {
synchronized(x){
isInterrupted = true;
super.interrupt();
}
}
通过指定 ThreadFactory
.
Executors.newFixedThreadPool(1, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r) {
@Override
public void interrupt() {
// do what you need
}
};
}
});
当然,ThreadFactory
可以用 lambda 表达式表示。
ThreadFactory factory = (Runnable r) -> new YourThreadClass(r);
如果线程不需要额外设置(比如将其设为守护进程),您可以使用方法引用。不过,构造函数 YourThreadClass(Runnable)
应该存在。
ThreadFactory factory = YourThreadClass::new;
我建议阅读 ThreadPoolExecutor
and Executors
的文档。他们提供的信息非常丰富。