Jay*_*esh 42 java concurrency multithreading threadpool
我的多线程概念很薄弱并且正在努力学习.
在我所知道的java中,我们不能再调用一次线程即ie
Thread t = new Thread; //Some Runnable
t.start();
t.start(); //Illegal and throw Exception at runtime.
Run Code Online (Sandbox Code Playgroud)
据我所知,当你再次调用t.start()时会抛出异常,因为一旦它离开t.start()方法并且你试图再次初始化东西,Thread的相关堆栈就会被销毁.
在这种情况下,我对Threadpool的了解是,它提供了更好的性能并节省了时间,因为不需要创建新线程.(我在http://www.javatpoint.com/thread-pooling-in-java上读到)
如果不需要在ThreadPool场景中创建新的Thread,那么它如何与刚刚完成其run方法的同一个线程一起工作,那么Thread是否可以再次使用?
我读了这篇http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html ,它说" java.util.concurrent中的大多数执行器实现使用线程池,它由工作线程组成这种线程与它执行的Runnable和Callable任务分开存在,通常用于执行多个任务. "
那么这里的Worker线程是什么,它与普通的Java Threads有什么不同?
使用此链接缓存线程池如何重用现有线程我得到了一些东西但仍然混淆了当我们使用线程池时可以消除哪种东西,并且使用普通Java线程提供更好的性能.
我们可以这样说,
线程有三个部分,
因此,考虑到上述3个步骤,使用Threadpool步骤1和步骤3可以在固定数量的线程创建后消除.只执行每个任务的第2步,这就是为什么Threadpool更快?我们可以这样说吗?我对么?
Jon*_*eet 34
如果不需要在ThreadPool方案中创建新的Thread,那么它如何与刚刚完成其run方法的同一个线程一起工作,那么Thread是否可以再次使用?
简单 - 原始线程从未实际完成.它只是等待执行另一个任务.在伪代码中:
// No, this isn't even slightly accurate! General impression only :)
while (!pool.isShutdown()) {
Runnable task = pool.waitForTaskOnQueue();
task.run();
}
Run Code Online (Sandbox Code Playgroud)
(显然当一个线程池关闭时,它也需要停止等待线程等待另一个任务 - 但希望你能得到一般的想法.)
小智 5
该过程分为两部分:
任务提交:线程池与阻塞队列紧密耦合。当我们说 executor.execute(runnable) 时。可运行/可调用在队列中排队。
任务的执行:现在需要从队列中提取任务。假设每当一个任务在队列中提交时,它就必须被拾取并执行。
所以有些线程将运行无限循环并观察任务队列。一旦任务可用,一个线程就会选择它并执行。