【发布时间】:2013-11-14 23:08:38
【问题描述】:
我的多线程概念很薄弱,正在努力学习。
据我所知,在 Java 中,我们不能多次调用线程:
Thread t = new Thread; //Some Runnable
t.start();
t.start(); //Illegal and throw Exception at runtime.
据我所知,当您再次调用 t.start() 时,它会引发异常,因为线程的关联堆栈一旦退出 run() 方法并且您尝试再次初始化,就会被销毁。
在这种情况下,我对线程池的了解是,它可以提供更好的性能并节省时间,因为不需要创建新线程(我在this 中读到)。
如果在线程池场景中不需要创建新线程,那么它如何与刚刚完成其运行方法的同一线程一起工作,该线程是否可以再次使用?
我读过this,它说“java.util.concurrent 中的大多数执行器实现都使用线程池,它由工作线程组成。这种线程与 Runnable 和 Callable 任务分开存在它执行并经常用于执行多个任务。"
那么这里的 Worker 线程是什么,它和普通的 Java 线程有什么不同吗?
通过this 链接,我得到了一些东西,但仍然对使用线程池可以消除哪些东西以及为什么它比使用普通 java 线程提供更好的性能感到困惑。
所以我们可以这样说,
线程分为三个部分,
- 创建(告诉操作系统它是新线程,为其创建堆栈。)
- 使用 run() 方法执行 Runnable。
- 销毁线程。
因此,考虑到以上 3 个步骤,线程池的第 1 步和第 3 步可以在创建固定数量的线程后消除。每个任务只会执行第 2 步,这就是为什么线程池更快?我们可以这样说吗?我说的对吗?
【问题讨论】:
-
这是simple, open-source Java thread pool。您实际上可以检查代码以了解它是如何工作的,在后台。
-
您指向的链接在 ThreadPool 构造函数中创建了 n 个 WorkerThread 对象并在其上调用 start() 方法,这只不过是创建 n 个 Thread 对象并在其上调用 start 方法,然后 Threadpool 如何帮助提高性能。
-
this link 可能会有所帮助
-
@Jayesh 空闲线程不会打扰系统,坏事是创建和销毁线程太多,实际上线程池多次使用线程而不是销毁并再次创建它。 this link 也可以描述这个问题。
-
@Jayesh 每个线程都需要它自己的堆栈,操作系统也应该切换(switch-context)并管理线程。除了线程对某些工作非常有效之外,它们也会成为敌人,拥有太多线程并不是很好(至少对于 CPU 而言)。使用 trhead 池,您完成了两件(一般)事情。 1.多次使用(回收)线程 2.通过限制创建多个线程来管理内存。您提到的时间是用于切换上下文和线程私有内存,每次创建和销毁都需要时间。
标签: java multithreading concurrency threadpool