还有另一种重启线程的可能性吗?
Is there another posibility to restart a Thread?
我读到无法重新启动相同 Thread
。如果它应该重新启动,那么你必须创建一个新的 Thread
.
但问题是,线程是有限的,你不能创建40,000个线程,因为操作系统只能创建15,000个线程。 (这只是一个例子)。
还有其他可能吗?
使用 Executor
或 ExecutorService
。 Class Executors
有一些工厂方法。通过使用一个线程池,您可以提交操作,而不必为每个单独的操作创建线程。
您可以使用 thread pool。例如,数据库连接通常在线程池中进行管理。完成工作后(例如,查询一些数据),线程 returns 到池中,可以重复使用。
您可能遗漏的另一件事是:虽然您不能同时拥有 40,000 个线程,但没有什么能阻止您在旧线程完成后创建新线程。
But the thing is, the threads are limited, you can not create 40,000 threads because the operating system can only create 15,000 threads. (This is just an example).
是的,这令人困惑 - 但您在混淆术语。
一个 java java.lang.Thread
对象 不是 OS-level thead.
您可以制作一百万个左右的 Thread 对象。来吧,试试吧。
您无法同时启动所有 100 万个 em,但是 - start()
会导致事情发生,最终导致创建 'OS level thread'。
线程结束后,java.lang.Thread
对象将保留,但 OS 级线程不会。因此,你的中心问题论点,我将总结为:
Restarting an existing java.lang.Thread object is better than creating a new java.lang.Thread object, because I read that you can only have 40k or so java.lang.Thread objects
完全错了。 'restarting' 对 j.l.Thread 对象的假设 re-use(这意味着它已经结束)与仅在 'old' 之后创建一个新对象之间的收益为零一个结束了。
如果你想 'restart' 一个线程,你必须做的是有一个 run()
方法(线程在新线程中结束 运行 ) 这是一个框架性的事情:它检查作业队列,从顶部拉出一个队列,运行它,然后返回检查队列。这等同于 'reusing a thread',尽管您现在只是在重塑 ExecutorPool
(融入核心 java 本身)和朋友们已经在做的事情。
ExecutorPools 可能是个好主意。但是,他们 'solve' 不是您的问题。你的问题实际上不是问题。
我读到无法重新启动相同 Thread
。如果它应该重新启动,那么你必须创建一个新的 Thread
.
但问题是,线程是有限的,你不能创建40,000个线程,因为操作系统只能创建15,000个线程。 (这只是一个例子)。
还有其他可能吗?
使用 Executor
或 ExecutorService
。 Class Executors
有一些工厂方法。通过使用一个线程池,您可以提交操作,而不必为每个单独的操作创建线程。
您可以使用 thread pool。例如,数据库连接通常在线程池中进行管理。完成工作后(例如,查询一些数据),线程 returns 到池中,可以重复使用。
您可能遗漏的另一件事是:虽然您不能同时拥有 40,000 个线程,但没有什么能阻止您在旧线程完成后创建新线程。
But the thing is, the threads are limited, you can not create 40,000 threads because the operating system can only create 15,000 threads. (This is just an example).
是的,这令人困惑 - 但您在混淆术语。
一个 java java.lang.Thread
对象 不是 OS-level thead.
您可以制作一百万个左右的 Thread 对象。来吧,试试吧。
您无法同时启动所有 100 万个 em,但是 - start()
会导致事情发生,最终导致创建 'OS level thread'。
线程结束后,java.lang.Thread
对象将保留,但 OS 级线程不会。因此,你的中心问题论点,我将总结为:
Restarting an existing java.lang.Thread object is better than creating a new java.lang.Thread object, because I read that you can only have 40k or so java.lang.Thread objects
完全错了。 'restarting' 对 j.l.Thread 对象的假设 re-use(这意味着它已经结束)与仅在 'old' 之后创建一个新对象之间的收益为零一个结束了。
如果你想 'restart' 一个线程,你必须做的是有一个 run()
方法(线程在新线程中结束 运行 ) 这是一个框架性的事情:它检查作业队列,从顶部拉出一个队列,运行它,然后返回检查队列。这等同于 'reusing a thread',尽管您现在只是在重塑 ExecutorPool
(融入核心 java 本身)和朋友们已经在做的事情。
ExecutorPools 可能是个好主意。但是,他们 'solve' 不是您的问题。你的问题实际上不是问题。