在我的应用程序中,我使用ScheduledExecutorService,但仅产生一个线程来处理计划的任务。这是因为ScheduledExecutorService不会生成线程来处理待处理的任务吗?
这是一个代码片段,将仅输出“ run()1”,而不是预期的“ run()1”,后跟“ run()2” …“ run()10”。
public class App { public static void main(String[] args) { int N = 10; Runnable runner = new Runnable() { public void run() { foo(); } }; for (int i = 0; i < N; i++) { executor.schedule(runner, i, TimeUnit.MILLISECONDS); } } private static void foo() { System.out.println("run() " + (++n)); synchronized (executor) { try { executor.wait(); } catch (InterruptedException ex) { Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); } } System.out.println("finished()"); } private static Logger logger = Logger.getLogger(App.class.getName()); private static int n = 0; private static ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); }
只有一个线程,因为您使用创建线程池Executors.newScheduledThreadPool(1),这意味着该线程池仅包含1个线程。如果需要10个线程,则将10作为参数传递。请注意,此方法返回的ScheduledThreadPoolExecutor文档明确指出线程池的大小是固定的。
Executors.newScheduledThreadPool(1)