Java 线程重用
我一直读到创建线程是昂贵的。
我也知道你不能重新运行一个线程。
我在课堂上看到:Executors
创建一个线程池,该线程池根据需要创建新线程,但在以前构造的线程可用时将重用这些线程。
请注意“重用”这个词。
线程池如何“重用”线程?
我一直读到创建线程是昂贵的。
我也知道你不能重新运行一个线程。
我在课堂上看到:Executors
创建一个线程池,该线程池根据需要创建新线程,但在以前构造的线程可用时将重用这些线程。
请注意“重用”这个词。
线程池如何“重用”线程?
我想我明白是什么让你感到困惑,所以这是我更长的答案:这个术语有点误导(显然,否则你不会问这个问题,特别强调“重用”):
线程池如何“重用”线程?
正在发生的事情是,单个线程可用于处理多个任务(通常作为 传递,但这取决于您的“执行器”框架:默认执行器接受 ,但您可以编写自己的“执行器”/线程池,接受比[like,say,a ]更复杂的东西)。Runnable
Runnable
Runnable
CancellableRunnable
现在,在默认实现中,如果一个线程在仍在使用时以某种方式终止,它会自动替换为一个新线程,但这不是他们正在谈论的“重用”。在这种情况下没有“重用”。ExecutorService
因此,确实,您不能在Java线程上调用两次,但是您可以将任意数量的代码传递给执行器,并且每个方法都应调用一次。start()
Runnable
Runnable
run()
你可以传递 30 到 5 个 Java,每个工作线程可能会调用,例如,6 次(实际上不能保证你将执行 6 次,但这是一个细节)。Runnable
Thread
run()
Runnable
Thread
在这个例子中,将被调用6次。每一个这6个将调用一次每个的方法:start()
start()
run()
Thread
来自 Javadoc:Thread.start()
* Causes this thread to begin execution; the Java Virtual Machine * calls the <code>run</code> method of this thread.
但是,在每个线程的方法中,应该取消排队,并且将调用每个线程的方法。因此,每个线程可以处理多个 .这就是他们所说的“线程重用”。run()
Runnable
run()
Runnable
Runnable
做自己的线程池的一种方法是使用阻塞队列,将runnables排队,并让你的每个线程,一旦它完成了处理a的方法,下一个(或块)的排队并运行它的方法,然后冲洗并重复。run()
Runnable
Runnable
run()
我猜部分混淆(有点令人困惑)来自这样一个事实,即a take a和在调用Runnable的方法时被调用,而默认线程池也采用。Thread
Runnable
start()
run()
Runnable
线程池中的线程方法不仅由运行单个任务组成。线程池中线程的方法包含一个循环。它从队列中拉出一个任务,执行该任务(当任务完成时返回循环),然后获取下一个任务。在不再需要线程之前,该方法不会完成。run
run
run
编辑以添加:
下面是 ThreadPoolExecutor 中内部类的方法。run
Worker
696: /**
697: * Main run loop
698: */
699: public void run() {
700: try {
701: Runnable task = firstTask;
702: firstTask = null;
703: while (task != null || (task = getTask()) != null) {
704: runTask(task);
705: task = null; // unnecessary but can help GC
706: }
707: } finally {
708: workerDone(this);
709: }
710: }