Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有ThreadFactory的newCachedThreadPool_Java_Multithreading_Threadpool_Java 7 - Fatal编程技术网

Java 带有ThreadFactory的newCachedThreadPool

Java 带有ThreadFactory的newCachedThreadPool,java,multithreading,threadpool,java-7,Java,Multithreading,Threadpool,Java 7,我正在为我的应用程序实现一个线程池,我想将newCachedThreadPool与ThreadFactory一起使用,我想知道我下面写的内容是否正确 1.使用newCachedThreadPool的想法是线程可以重用,空闲线程将像提供的jdk7文档一样适当终止。然而,当我编写代码时,我有一些疑问,因为在newThread(Runnable r)中,我返回了MyThread的新实例,并且我也返回了MyThread MyThread=new MyThread()在main中。因此,如果有经验的开发人

我正在为我的应用程序实现一个线程池,我想将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.
哪些是正确的输出,我要问的是设置是否正确。

通常,您不应该向
ExecutorService#submit(Runnable)
方法提交
线程。尽管
Thread
实现了
Runnable
接口,但这是一个工件()

通常,您会将任务提交给
执行器服务
。这些任务是关于必须做什么的描述,关于哪个线程将做这件事。辅助线程的管理完全由
ExecutorService
实现(以及内部使用的
ThreadFactory
)完成

至少有人可以这么说

if(this instanceof MyThread){
    System.out.println("Thread is MyThread");
}
没有意义,因为
测试的
实例将始终为真。也许你想测试一下

if(Thread.currentThread() instanceof MyThread) {
    System.out.println("This runnable is executed by a Thread that is a MyThread");
}
但是,由于您正在设置适当的
ThreadFactory
,因此将始终打印此消息

因此,根据您的“卓越性”应该是什么,这可以在
Runnable
的特殊实现中完成,也可以在您的特殊
MyThread
类中完成。更准确地说:合适的解决方案将取决于这个“很棒的东西”是应该与执行的任务相关,还是与执行任务的线程相关


在任何情况下,您也应该考虑手动创建一个实例:<代码> TycRePoLeExtPotoor <代码>,在其中重写OR方法,以便做一些令人敬畏的事情。

您永远不会在MyType的运行中运行可运行的……AssiLaaS:请详细说明一下好吗?我的线程知识非常有限,你从不调用
r.run()
@assylias:我想
cachedPool.submit(myThread)
会这样做,不是吗?不,Thread.run()会这样做-但是你从来没有在这里调用过
super.run()
。谢谢你的回答,我之所以检查MyThread的
t instanceof
是因为有不同类型的线程。例如,现在我只返回MyThread(r)
,但我想要的是提取一些类型的
可运行r
信息,这样我就可以决定创建哪个线程,但是,
r
是类型
ThreadPoolExecutor$Worker
,所以我不知道如何创建。你有解决这个问题的方法吗?是的,
Worker
类做一些内部簿记。但是,有一个线程池,通常情况下,哪个线程执行哪个任务并不重要。也许你应该在更高的抽象层次上描述你真正想要实现的东西。。。