带有ThreadFactory的newCachedThreadPool

时间:2014-04-02 08:07:21

标签: java multithreading threadpool java-7

我为我的应用程序实现了一个线程池,我想使用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.

这是正确的输出,我要问的是我是否正确设置。

1 个答案:

答案 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的实例,在其中覆盖beforeExecuteafterExecute方法,以便做出令人敬畏的事情。