下面的两个线程调用有什么不同?这两个调用会有相似的表现吗?
注意:我没有同时使用#1和#2,这是最好的选择。
private void startConnections(){
ServerThread server = new ServerThread();
server.start(); // #1
Thread serverThread = new Thread(server);
serverThread.start(); //#2
}
class ServerThread extends Thread{
public void run(){}
}
发布于 2012-03-11 03:21:10
第一种方法是可以接受的,但不被鼓励。第二个可以工作,但是坏了/很难理解。考虑第三个问题:
class ServerRunnable implements Runnable {
public void run(){}
}
Runnable run = new ServerRunnable();
Thread serverThread = new Thread(run);
serverThread.start(); //#3
#1
这是一种非常常见的方法-为了创建一个新线程,您只需将其子类化并调用start()
方法即可。许多人,包括我自己,发现这个习惯用法是一个糟糕的实践-它不必要地将任务( run()
方法的内容)与线程(Thread
类)结合在一起。
#2
我从来没有见过这样的代码,虽然在技术上可以工作,但我会立即更正它。即使您正在创建一个线程实例,您也会将其传递给另一个线程并启动后者。那么为什么一开始就创建第一个线程呢?请注意,Thread
也实现了Runnable
,所以它在技术上是可行的,但实际上很笨拙。
#3
那么我有什么建议呢?实现未耦合到线程的Runnable
接口。您不能单独在单独的线程中运行Runnable
,必须显式创建该线程。但拥有原始Runnable
也允许您轻松地从原生线程切换到例如线程池。
从技术上讲,你可以扩展Thread
并将这样一个"runnable“放在线程池中,但这真的很难理解,而且你也不必要地背负着Thread
的负担(这是一个相当大的类)。
https://stackoverflow.com/questions/9649357
复制相似问题