Java newSingleThreadExecutor,并在使用ThreadFactory时按顺序执行

Java newSingleThreadExecutor,并在使用ThreadFactory时按顺序执行,java,multithreading,executors,Java,Multithreading,Executors,我想了解一下newSingleThreadExecutor——下面是怎么说的,当没有提到ThreadFactory时,它是如何按顺序执行任务的 public static ExecutorService newSingleThreadExecutor() 创建一个执行器,该执行器使用在无界队列上运行的单个工作线程。(但是请注意,如果此单个线程在关机之前的执行过程中由于故障而终止,则在需要执行后续任务时,将替换一个新线程。)任务保证按顺序执行,并且在任何给定时间都不会有多个任务处于活动状态。与其

我想了解一下
newSingleThreadExecutor
——下面是怎么说的,当没有提到
ThreadFactory
时,它是如何按顺序执行任务的

public static ExecutorService newSingleThreadExecutor()
创建一个执行器,该执行器使用在无界队列上运行的单个工作线程。(但是请注意,如果此单个线程在关机之前的执行过程中由于故障而终止,则在需要执行后续任务时,将替换一个新线程。)任务保证按顺序执行,并且在任何给定时间都不会有多个任务处于活动状态。与其他等效的
newFixedThreadPool(1)
不同,返回的执行器保证不可重新配置以使用其他线程

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

public static ExecutorService newSingleThreadExecutor(ThreadFactory 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新螺纹[id:500]
  • 1:02:01.160 DEB新螺纹[id:900]
  • 1:03:01.200战争开始线程[thID:900]
  • 1:04:02.200战争开始线程[thID:500]

实际上,Executors.newSingleThreadExecutor()为您提供了一个ExecutorService实例,它保证每次只使用一个线程来执行您提交的任务。您提交的任务将连续执行

摘自Executors.java源代码

public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>(),
                                threadFactory));
}
公共静态执行器服务newSingleThreadExecutor(ThreadFactory ThreadFactory){
返回新的FinalizableDelegatedExecutorService
(新线程池执行器(1,1,
0L,时间单位为毫秒,
新建LinkedBlockingQueue(),
),;
}

ThreadPoolExecutor
的第二个参数是最大线程池大小
newSingleThreadExecutor
对此参数使用1,这保证您一次最多使用一个线程。

每个
Executor
都使用
ThreadFactory
来创建所需的线程。如果您没有显式地提供一个线程,它将使用一个默认线程,该线程返回一个非常简单的线程,但带有一个名称

没有工厂的方法将只委托给具有工厂的方法

public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
    return new DelegatedScheduledExecutorService
        (new ScheduledThreadPoolExecutor(1));
}
执行者一开始根本没有线程,他们会在需要时创建一个线程。它们可以同时使用的线程数量取决于它们的配置

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


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

您是如何发现您的任务不是逐个执行的?你如何提交你的TAK?更多代码plz。