0

可能重复:
Java:“实现可运行”与“扩展线程”

我只是想知道创建自己的扩展 Thread 的自定义对象和使用 Thread(Runnable) 构造函数创建线程之间是否存在一些细微的区别?

当我使用扩展 Thread 的类时,我有一些代码可以正常工作,但是如果我尝试使用通过使用 Thread(Runnable) 构造函数创建线程的逻辑,则新线程似乎无法正常工作 - 我无法检测到它们就像我使用我制作的自定义子类时一样,它们似乎永远不会结束。

在我的代码中,我只是产生了几个线程,然后在我的线程列表中搜索以找到一个活着的并加入它直到它死亡。然后我再次在列表中搜索一个还活着的线程并加入它。这一直持续到所有线程都死掉。

谢谢阅读。

4

3 回答 3

2

线程是用于工作的资源。Runnable 是一项工作。您是在创建一种新型资源,还是只是定义您想要完成的工作?

要“结束”线程,您只需从“运行”方法返回。需要查看您的代码示例,以了解您无法判断它们是否处于活动状态的意思。

当然,创建 Runnables 还可以更轻松地重构代码以在将来使用 ThreadPool。

于 2012-04-26T20:45:32.433 回答
2

在我的代码中,我只是生成了几个线程,然后在我的线程列表中搜索以找到一个活着的并加入它直到它死去。

您如何(以及为什么)“搜索我的线程列表”?相反,我会将其添加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();
  }

更好的办法是使用ExecutorServices 给出的 s 之一Executors。他们有很多关于创建线程池和等待池完全完成的功能。几乎总是推荐过来new Thread(...)

我无法检测到它们的存在方式与我使用我制作的自定义子类时的方式相同

如果您尝试设置 的名称,Thread那么您不能在Runnable. 但是,您可以run()方法中执行此操作。你可以做:

  new Thread(new Runnable() {
      public void run() {
          Thread.currentThread().setName("...");
      }
  });

Thread否则,我不确定为什么除非它已经完成,否则你不会看到你的。

他们似乎永远不会结束。

使用 a Runnable,线程在run()方法返回时结束 - 通过 areturn或 a throw。这与扩展非常相似,Thread所以我不确定为什么这不起作用。

于 2012-04-26T20:49:00.397 回答
1

我真的建议使用并发实用程序,而不是尝试自己管理线程,这很复杂且容易出错。使用并发 api 还可以帮助您立即应用正确的模式。

于 2012-04-26T20:50:57.823 回答