新的线程(Runnable runnableObj)比。 扩展Thread
可能重复:
Java:“实现Runnable”与“扩展线程”
我只是想知道创建自己的自定义对象来扩展Thread并使用Thread(Runnable)构造函数创建线程之间有一些细微的差别吗?
当我使用扩展线程的类时,我有一些工作正常的代码,但是如果我尝试使用通过使用线程(Runnable)构造函数创建线程的逻辑,新线程似乎不能正常工作 - 我无法检测到它们像我使用我制作的自定义子类一样活着,而且他们似乎永远不会结束。
在我的代码中,我只是产生了一些线程,然后搜索我的线程列表以找到一个活着的并加入它,直到它死亡。 然后,我再次搜索列表中的一个线程,这个线程已经存在并加入到线程中。这个过程一直持续到所有线程都死掉。
谢谢阅读。
线程是做工作的资源。 Runnable是一项工作。 您是在创建一种新的资源类型,还是仅仅定义您想要完成的工作?
为了“结束”线程,您只需从“运行”方法返回即可。 需要查看代码示例,以查看您的意思,即无法分辨它们是否处于活动状态。
创建Runnables当然也使得将代码重构变得更容易,以便将来使用ThreadPool。
在我的代码中,我只是产生了一些线程,然后搜索我的线程列表以找到一个活着的并加入它,直到它死亡。
你是如何(以及为什么)“通过我的线程列表搜索”? 我会将Thread
添加到某种Collection
,然后您可以依次迭代并逐个加入每个Thread
:
List<Thread> threads = new ArrayList<Thread();
for (int i = 0; i < 100; i++) {
Thread thread = new Thread(new Runnable() ...);
thread.start();
threads.add(thread);
}
...
for (Thread thread : threads) {
thread.join();
}
更好的办法是使用ExecutorService
提供的Executors
。 他们围绕创建线程池和等待池完全完成有很多功能。 几乎总是建议使用new Thread(...)
。
当我使用我制作的自定义子类时,我无法检测到它们的活着
如果你正在设置Thread
的名字,那么你不能在你的Runnable
的构造函数中这样做。 但是,您可以在run()
方法中执行此操作。 你可以做:
new Thread(new Runnable() {
public void run() {
Thread.currentThread().setName("...");
}
});
否则,我不知道为什么你不会看到你的Thread
除非它已经完成。
他们似乎永远不会结束。
使用Runnable
,线程在run()
方法返回时结束 - 无论是通过return
还是throw
。 这与扩展Thread
非常相似,所以我不确定为什么这不起作用。
我真的推荐使用并发实用程序,而不是试图自己管理线程,这很复杂且容易出错。 使用并发api还可以帮助您马上应用正确的模式。
链接地址: http://www.djcxy.com/p/92073.html