- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我的应用程序实现一个线程池,我想将 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
实例,在其中覆盖 beforeExecute或afterExecute方法来做出很棒的事情。
关于java - newCachedThreadPool 和 ThreadFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22805176/
我尝试使用简单的线程来做到这一点并成功了,但我相信使用线程池我可以更有效地完成同样的事情:)?简单线程: public static class getLogFile implements Runna
我想就 Zeller 一年多前发布的同一个问题询问更多细节... javadoc 说 Executors.newCachedThreadPool 返回的服务重用了线程。这怎么可能? 我知道队列结构是如
javadoc 说 Executors.newCachedThreadPool 返回的服务重用了线程。这怎么可能?线程只能通过调用 start 启动一次。那么他们是如何实现的呢?此服务的线程正在无限循
我想记录由 newCachedThreadPool 调用创建的 Activity 线程数。我似乎无法找到从哪里获得这个值。 最佳答案 您可以通过 ThreadFactory至 newCachedThr
我正在为我的应用程序实现一个线程池,我想将 newCachedThreadPool 与 ThreadFactory 一起使用,我想知道我下面写的是否正确。 1.使用newCachedThreadPoo
这个问题在这里已经有了答案: Executors.newCachedThreadPool() versus Executors.newFixedThreadPool() (8 个答案) 关闭 7 年
我做了两个独立的数据库并行读取实现。第一个实现是将 ExecutorService 与 newCachedThreadPool() 构造函数和 Futures 一起使用:我只需调用一个为每个读取案例返
使用Executors.newCachedThreadPool()时,线程池中最初创建了多少个线程,Javadoc没有指定任何数字,是否有一个保证的数字,我们最初总是会得到10个之类的东西.以下文档:
我正在使用 Executors.newCachedThreadPool() 来处理客户端 api 请求。看来,当平均 10tps 流量时,java 进程的驻留内存会随着时间的推移而增长,并且不会减少。
此方法的规范:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newCachedThread
保罗·泰玛 presentation有这一行: Executors.newCacheThreadPool evil, die die die 为什么它是邪恶的? 我会大胆猜测:是不是因为线程数量会无限
在此测试场景中提交的任务(线程)数量也不大。 最佳答案 您需要提供有关如何在池上实例化和调用 submit 的代码示例(IP 在这里应该不是问题,因为我们不需要您的 Callable 类或类似的东西)
我是一名优秀的程序员,十分优秀!