我为我的应用程序实现了一个线程池,我想使用newCachedThreadPool和ThreadFactory,我想知道下面写的是正确的。
1.使用newCachedThreadPool的想法是该线程可以重用,并且该空闲线程将像jdk7 doc提供的那样被适当终止。但是,当我编写代码时,我有一些疑问,因为在newThread(Runnable r)
中,我返回MyThread
的新实例,我在MyThread myThread = new MyThread();
中也main
。所以,如果经验丰富的开发人员可以指出我在下面做了什么是正确的,我将非常感谢。谢谢
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
public class ThreadFactoryTest{
public static void main(String[] args) {
ExecutorService cachedPool = Executors.newCachedThreadPool(new MyThreadFactory());
MyThread myThread = new MyThread();
cachedPool.submit(myThread);
}
}
class MyThreadFactory implements ThreadFactory{
@Override
public Thread newThread(Runnable r) {
return new MyThread(r);
}
}
class MyThread extends Thread {
public MyThread(Runnable r){
super(r);
}
public MyThread(){
super();
}
@Override
public void run() {
Thread t = Thread.currentThread();
if(t instanceof MyThread){
System.out.println("Thread is MyThread");
}
System.out.println("Inside: " + this.getName());
Utils.awesome();
}
}
class Utils{
public static void awesome(){
Thread t = Thread.currentThread();
if(t instanceof MyThread){
System.out.println("Inside awesome() and Thread is MyThread. Provide special awesomeness for MyThread.");
}
}
}
当我运行上述程序时,它会生成
Thread is MyThread
Inside: Thread-1
Inside awesome() and Thread is MyThread. Provide special awesomeness for MyThread.
这是正确的输出,我要问的是我是否正确设置。
答案 0 :(得分:1)
通常,您不向Thread
方法提交ExecutorService#submit(Runnable)
。虽然Thread
实现了Runnable
接口,但这是一个工件(Why does Thread implement Runnable?)。
通常,您将任务提交给ExecutorService
。这些任务是关于必须要做什么的描述,关于哪个线程将会这样做。工作线程的管理完全留给ExecutorService
实现(以及它在内部使用的ThreadFactory
)。
至少有一个人可以这么说
if(this instanceof MyThread){
System.out.println("Thread is MyThread");
}
没有意义,因为instanceof
测试总是正确的。也许你想测试像
if(Thread.currentThread() instanceof MyThread) {
System.out.println("This runnable is executed by a Thread that is a MyThread");
}
但是,由于您正在设置适当的ThreadFactory
,因此将始终打印此消息
所以取决于你的" awesomeness"应该是,这可以在Runnable
的特殊实现中完成,也可以在特殊的MyThread
类中完成。更准确地说:适当的解决方案将取决于这是否真的很棒?#34;应与正在执行的任务或正在执行任务的线程相关。
在任何情况下,您还应考虑手动创建ThreadPoolExecutor
的实例,在其中覆盖beforeExecute或afterExecute方法,以便做出令人敬畏的事情。