我看到这个问题被问了很多次。很抱歉再次问这个问题。我有个奇怪的问题。
我有一个通过ExecutorService作为单独的可运行任务提交数千个作业的职务。这是在一个简单的for循环中完成的。在for循环的末尾,我调用service.候机(),然后是一个等待高潮。
由于要提交的线程数量很大,所以线程一直挂起,直到所有任务都提交为止。
有任何方法,这些线程可以优雅地终止,一旦它的执行完成?
您可以创建一个新的ThreadPoolExecuto
不打电话java.util.concurrent.Executors
:
int corePoolSize = 0;
int maximumPoolSize = 64;
int keepAliveTime = 5000;
ExecutorService executorService =
new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>());
在javadoc中:“如果池当前有多个corePoolSize线程,那么如果多余的线程已经空闲超过了持有AliveTime,那么多余的线程将被终止”
编辑:
下面是一个很小的例子,如果您在Eclipse调试环境中运行这个示例,您应该可以看到线程的来来去去:
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ExecutorTest {
public static void main(String[] args) {
ExecutorService executorService = new ThreadPoolExecutor(0, 64, 1000,
TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>());
for (int i = 0; i <= 500; i ++) {
try {
Thread.sleep(new Random().nextInt(200));
} catch (InterruptedException e) {
}
executorService.submit(new TestTask());
}
}
public static class TestTask implements Runnable {
public void run() {
try {
Thread.sleep(new Random().nextInt(1500));
} catch (InterruptedException e) {
}
}
}
}