同时创建动态线程数
2022-09-03 08:56:56
每次我都必须创建可变数量的线程。我通过创建一个线程数组并创建多个线程来执行此操作。
但是,我不明白如何启动这些n个线程的行为,就像多线程概念一样。我希望它们并行运行。
请指导如果在这个塞纳里奥做什么。
每次我都必须创建可变数量的线程。我通过创建一个线程数组并创建多个线程来执行此操作。
但是,我不明白如何启动这些n个线程的行为,就像多线程概念一样。我希望它们并行运行。
请指导如果在这个塞纳里奥做什么。
但是,我不明白如何启动这些n个线程的行为,就像多线程概念一样。我希望它们并行运行。
您当然可以使用循环创建线程数组:
Thread[] threads = new Thread[NUM_JOBS_TO_CREATE];
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread(new Runnable() {
public void run() {
// some code to run in parallel
// this could also be another class that implements Runnable
}
});
threads[i].start();
}
这将导致线程在后台并行运行。然后,您可以稍后加入它们,等待它们全部完成,然后再继续。
// wait for the threads running in the background to finish
for (Thread thread : threads) {
thread.join();
}
但是,与其自己管理线程,我建议使用内置的Java执行器
。他们为您完成所有这些操作,以便您更轻松地进行管理。此方法的一个优点是它将任务与运行任务的线程分开。例如,您可以启动 10 个线程来并行运行 1000 个和 1000 个任务。
下面是一些示例代码:ExecutorService
// create a pool of threads, 10 max jobs will execute in parallel
ExecutorService threadPool = Executors.newFixedThreadPool(10);
// submit jobs to be executing by the pool
for (int i = 0; i < NUM_JOBS_TO_CREATE; i++) {
threadPool.submit(new Runnable() {
public void run() {
// some code to run in parallel
// this could also be another class that implements Runnable
}
});
}
// once you've submitted your last job to the service it should be shut down
threadPool.shutdown();
// wait for the threads to finish if necessary
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
有关详细信息,请参阅有关线程执行器的 Java 教程。
非常努力地不创建线程数组并尝试管理它们 - 它很快就会变成一团糟。如果需要线程池来运行任务,则需要一个生产者-使用者队列。创建一个,并在创建线程时将其(或将其作为成员包含的 threadpool 对象实例)传递到线程中。线程循环,获取任务并执行它们。
执行此操作的简单方法是使用执行器服务,如 @Gray (+1) 中所述。
为了强调,我再说一遍,不要试图微观管理数组,列表或向量中的线程,启动它们,在“老板/管理”循环中检查它们的状态,终止/中止它们,破坏它们等等。这就像一辆保时捷911 - 在花费了大量的金钱/时间才能买到一辆之后,你会有一些看起来工作正常的东西,然后它会突然折断,把你推到一棵树上。
对于长时间阻塞的作业,请使用专用线程,对于可以密集快速完成的作业,请使用线程池。