新的线程(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

上一篇: new Thread(Runnable runnableObj) Vs. extends Thread

下一篇: questions on implementing Runnable