java - newCachedThreadPool 和 ThreadFactory

标签 java multithreading threadpool java-7

我正在为我的应用程序实现一个线程池,我想将 newCachedThreadPool 与 ThreadFactory 一起使用,我想知道我下面写的是否正确。

1.使用newCachedThreadPool的思想是线程可以重用,并且空闲线程将像jdk7文档提供的那样被适当终止。然而,当我编写代码时,我有一些疑问,因为在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.

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

最佳答案

一般来说,您不应该将Thread提交给ExecutorService#submit(Runnable)方法。尽管 Thread 实现了 Runnable 接口(interface),但这只是一个工件 ( 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,因此始终会打印此消息

因此,根据您的“令人敬畏”应该是什么,这可以在 Runnable 的特殊实现中完成,或者在您的特殊 MyThread 类中完成。更准确地说:适当的解决方案将取决于这个“很棒的东西”是否应该与执行的任务相关,或者与正在执行任务的线程相关。

无论如何,您还应该考虑手动创建 ThreadPoolExecutor 实例,在其中覆盖 beforeExecuteafterExecute方法来做出很棒的事情。

关于java - newCachedThreadPool 和 ThreadFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22805176/

相关文章:

java - Ubuntu 没有这样的文件或目录

java - 节点上未调用 MouseDragRelease

c# - 一线程挂起

c# - 线程等待时持续处理

c - 使用 CreateThreadpoolWork/SubmitThreadpoolWork 时将不同的值传递给回调函数

java - Hibernate ManyToOne Lazy 不工作最终类

java - 使用 Oracle createTemporary 更新 Clob

java - 通过创建线程池在运行 JUnit 测试脚本时在线程之间添加延迟

c++ - C++中的大量线程和效率

@Async 方法中的 Spring @Async 方法