2012-04-26 48 views
0

可能重复:
Java: “implements Runnable” vs. “extends Thread”新的线程(Runnable runnableObj)比。继承Thread

我只是想知道是否有创建继承Thread自己的自定义对象并使用线程创建一个线程之间的一些微妙的差异(Runnable接口)构造函数?

我有一些代码在我使用扩展线程的类时正常工作,但如果我尝试使用通过使用线程(Runnable)构造函数创建线程的逻辑,新线程似乎不能正常工作 - 以和我使用我制作的自定义子类相同的方式检测它们是否存在,并且它们似乎并没有结束。

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

感谢您的阅读。

+0

虽然您可以显示您的代码(并更改标题)以使其成为唯一的问题,但这是重复的。 – Gray 2012-04-26 20:43:41

回答

2

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

要'结束'你只需从'run'方法返回的线程。需要查看代码示例,以查看您的意思,即无法分辨它们是否处于活动状态。

创建Runnables当然还可以让您的代码在未来重构为使用ThreadPool。

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(); 
    } 

更妙的是使用由Executors给出的ExecutorService S的一个。他们围绕创建线程池并等待池完全完成有很多功能。几乎总是建议超过new Thread(...)

我无法检测他们还活着以同样的方式,当我使用自定义的子类我做

如果你正在尝试设置Thread的名字,那么你可以在你的Runnable的构造函数中不要这样做。你可以然而在run()方法中做这个。你可以这样做:

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

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

他们似乎并没有结束,永远。

使用Runnable,线程完成时的run()方法返回 - 无论是通过returnthrow。这与延伸Thread非常相似,所以我不确定为什么这不起作用。

1

我真的会推荐使用concurrency utility而不是试图自己管理线程,这是复杂和容易出错的。 使用并发api还可以帮助您马上应用正确的模式。