这显然是一个老建议,因为在 Windows 上休眠会导致主线程暂停并处理后台线程。您可以将旧线程概念想象为队列,并且只有前端线程获得处理时间。一旦该线程被搁置(在 Windows 上甚至 sleep(1) 就足够了),当前线程将被置于队列的末尾,其他线程将被处理。
然而,现代操作系统处理这个完全不同的问题,这个建议今天是多线程实现错误的标志。Java 为您提供了设置线程优先级的选项,并允许您轻松使用后台线程进行繁重的处理。今天你会像这样实现它:
首先,我们需要一个用于低优先级线程的 ThreadFactory:
public class PriorityThreadFactory implements ThreadFactory {
protected final ThreadGroup allThreads;
public PriorityThreadFactory(final String name, final int priority, final boolean daemon) {
this.allThreads = new ThreadGroup(name);
this.allThreads.setMaxPriority(priority);
this.allThreads.setDaemon(daemon);
}
@Override
public Thread newThread(final Runnable r) {
return new Thread(this.allThreads, r);
}
}
然后我们创建一个 ExecutorService 并将优先级设置为Thread.MIN_PRIORITY
:
final PriorityThreadFactory threadFactory = new PriorityThreadFactory("workers", Thread.MIN_PRIORITY, true);
final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), threadFactory);
最后,我们可以提交任意数量的任务,它们将在后台处理,不会阻塞像 UI-Thread 这样的重要线程。
executor.submit(new MyWorkerTask());