同时创建动态线程数

每次我都必须创建可变数量的线程。我通过创建一个线程数组并创建多个线程来执行此操作。

但是,我不明白如何启动这些n个线程的行为,就像多线程概念一样。我希望它们并行运行。

请指导如果在这个塞纳里奥做什么。


答案 1

但是,我不明白如何启动这些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 教程


答案 2

非常努力地不创建线程数组并尝试管理它们 - 它很快就会变成一团糟。如果需要线程池来运行任务,则需要一个生产者-使用者队列。创建一个,并在创建线程时将其(或将其作为成员包含的 threadpool 对象实例)传递到线程中。线程循环,获取任务并执行它们。

执行此操作的简单方法是使用执行器服务,如 @Gray (+1) 中所述。

为了强调,我再说一遍,不要试图微观管理数组,列表或向量中的线程,启动它们,在“老板/管理”循环中检查它们的状态,终止/中止它们,破坏它们等等。这就像一辆保时捷911 - 在花费了大量的金钱/时间才能买到一辆之后,你会有一些看起来工作正常的东西,然后它会突然折断,把你推到一棵树上。

对于长时间阻塞的作业,请使用专用线程,对于可以密集快速完成的作业,请使用线程池。