在不破坏和重新创建线程的情况下,可以使用同一线程一个接一个地执行许多任务吗?
public class SimpleThreadPool {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
Runnable worker = new WorkerThread("" + i);
executorService.execute(worker); // How many threads are created?
}
executorService.shutdown();
while (!executorService.isTerminated()) {
}
System.out.println("All threads Executed");
}
}
答案 0 :(得分:3)
是的,相同的Thread
可用于运行多个任务。这就是ExecutorService
的作用:它维护用于重用线程的线程池,而不是为每个任务创建新线程。下面是一个大概的实现方法:
import java.util.Objects;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
public class MyExecutor implements Executor {
private final BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
private final Thread thread = new Thread(() -> {
try {
while (!Thread.interrupted()) {
queue.take().run();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}, "my-executor-thread");
@Override
public void execute(Runnable command) {
Objects.requireNonNull(command);
queue.add(command);
synchronized (thread) {
if (thread.getState() == Thread.State.NEW) {
thread.start();
}
}
}
}
请注意,实际的实现要比这复杂得多。例如,如果某些错误导致当前错误消失,我没有添加创建新Thread
的方法。我也不保护Thread
免受Runnable
引发的异常的影响。
如您所见,Runnable
与Thread
一起使用的Thread(Runnable)
(通过新的BlockingQueue
)只是等待任务放入BlockingQueue
中。将新任务添加到Thread
时,run()
接受并执行Thread
。这样一来,一个<!-- one -->
<div id="parent-one">
<div id="head-one">
<!-- some code here -->
</div>
<div>
<div>
<input type='text' value='x' name='name'>
</div>
</div>
</div>
<!-- two-->
<div id="parent-two">
<div id="head-two">
<!-- some code here -->
</div>
<div>
<div>
<input type='text' value='y' name='name'>
</div>
</div>
</div>
可以执行多个任务而不被销毁,而另一个代替它。
请注意,这意味着如果池的所有线程(在这种情况下为单线程)正忙于某个任务,则任何排队的任务都必须等待。
答案 1 :(得分:0)
ExecutorService executorService = Executors.newFixedThreadPool(5);
这样只会在Executor
中创建5个线程。
for (int i = 0; i < 10; i++) {
Runnable worker = new WorkerThread("" + i);
executorService.execute(worker); // How many threads are created?
}
这将创建10个任务,这些任务将提交给执行者服务以执行。 ExecutorService将使用固定的5个线程来执行这10个任务。 所以是的,您将有一个线程可以执行多个任务而无需重新创建。