Java遍历集合开线程如何控制线程池将线程全部走完
时间: 2024-02-06 16:40:33 浏览: 69
可以使用`ExecutorService`来创建一个线程池,然后通过`submit()`方法将任务提交给线程池。在任务执行完毕后,可以调用`shutdown()`方法来关闭线程池。
下面是示例代码:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (String s : list) {
executorService.submit(new Task(s));
}
executorService.shutdown();
}
static class Task implements Runnable {
private String s;
public Task(String s) {
this.s = s;
}
@Override
public void run() {
System.out.println("Thread " + Thread.currentThread().getName() + " is processing " + s);
// do something
}
}
}
```
在上面的例子中,我们使用`newFixedThreadPool(3)`创建了一个大小为3的线程池。然后,我们遍历集合中的元素,将每个元素封装成一个`Task`对象并提交给线程池。最后,我们调用`shutdown()`方法关闭线程池。
在这个例子中,我们不能保证所有的任务都会被线程池执行完毕,因为线程池中的线程是异步执行的。如果需要等待所有任务都执行完毕再关闭线程池,可以使用`awaitTermination()`方法:
```java
executorService.shutdown();
try {
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
```
这里将线程池关闭,然后等待所有线程执行完毕,等待时间为Long.MAX_VALUE纳秒(相当于永久等待)。如果线程池在等待时间内没有执行完毕,将抛出InterruptedException异常。
阅读全文