gpt4 book ai didi

java - newSingleThreadExecutor 以及使用 ThreadFactory 时的顺序

转载 作者:行者123 更新时间:2023-11-30 04:03:47 26 4
gpt4 key购买 nike

我试图了解有关 newSingleThreadExecutor 的一些内容 - 下面说的是,当没有提到 ThreadFactory 时,它是如何按顺序执行任务的。

public static ExecutorService newSingleThreadExecutor()

创建一个执行器,该执行器使用在无界队列上运行的单个工作线程。 (但请注意,如果该单个线程由于关闭前执行过程中的失败而终止,则如果需要执行后续任务,一个新线程将取代它。)保证任务按顺序执行,并且不会有超过一个任务处于 Activity 状态在任何给定时间。与其他等效的 newFixedThreadPool(1) 不同,返回的执行程序保证不能重新配置以使用其他线程。

public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory)

创建一个 Executor,它使用在无界队列上运行的单个工作线程,并在需要时使用提供的 ThreadFactory 创建新线程。与其他等效的 newFixedThreadPool(1, threadFactory) 不同,返回的执行程序保证不可重新配置以使用其他线程。

参数:

但是给出下面的示例,我使用 ThreadFactory :

executor = Executors.newSingleThreadExecutor(getPrioritisedFactory());
`private ThreadFactory getPrioritisedFactory() {
ThreadFactory prioritisedFactory = new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread t = new Thread(r, recSocketServerThreadID);
t.setPriority(Thread.MAX_PRIORITY);
return t;
}
};
return prioritisedFactory;
}`

似乎不再尊重顺序了。是因为线程具有相同的优先级,然后开始随机选择它们吗? Java 帮助中不太清楚使用工厂时发生的情况。

谢谢。

<小时/>

感谢您到目前为止得到的答复。这是更多代码和解释。我在高负载条件下(1000 个提交的线程)的日志中发现,一个线程先提交的项目是在其他人稍后提交后开始的。

该示例已简化,但 MyThread.run 方法中没有更多可以延迟日志记录的代码。

  • 1:00:01.100 DEB new thread[id:500]
  • 1:02:01.160 DEB new thread[id:900]
  • 1:03:01.200 WAR Started thread [thID:900]
  • 1:04:02.200 WAR Started thread [thID:500]
private ExecutorService executor;


executor = Executors.newSingleThreadExecutor(getPrioritisedFactory());
....
//Keep adding threads here
MyThread mine=MyThread();
System.out.println(String.format("new thread[id:%d]",
mine.getId()));
executor.execute(mine);



public class MyThread extends Thread
{

@Override
public void run() {
long startTimeMillis = System.currentTimeMillis();
long currentTimeMillis = System.currentTimeMillis();
long delayMillis = currentTimeMillis - this.createTimeMillis;
logger.warn(String.format("Started thread [thID:%d]",
this.getId()));
........
}

}

最佳答案

每个Executor都使用一个ThreadFactory来创建它需要的线程。如果您没有明确提供,它将采用默认的线程,该线程返回一个相当简单的线程,但带有名称。

没有工厂的方法只会委托(delegate)给有工厂的方法。

public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
return new DelegatedScheduledExecutorService
(new ScheduledThreadPoolExecutor(1));
}

执行器一开始根本没有线程,他们会在需要时创建一个线程。它们可以同时使用的线程数量取决于它们的配置。

如果一个线程由于某种原因死亡,他们可以创建一个新线程来替换它。 SingleThreadExecutor 保证永远不会使用超过 1 个。

保证您的代码按顺序执行,但不保证它始终是同一个线程。

关于java - newSingleThreadExecutor 以及使用 ThreadFactory 时的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21282000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com