下面两个线程调用有什么区别? 这两个电话会同样行事吗?
注意:我没有使用#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(){}
}
答案 0 :(得分:9)
第一种方法是可以接受的,但是气馁。第二个有效,但很难理解。考虑第三个:
class ServerRunnable implements Runnable {
public void run(){}
}
Runnable run = new ServerRunnable();
Thread serverThread = new Thread(run);
serverThread.start(); //#3
这是非常常见的方法 - 为了创建一个新线程,您只需将其子类化并调用start()
方法。许多人,包括我自己,都认为这种习惯是一种糟糕的做法 - 它不必要地将任务(run()
方法的内容)与线程(Thread
类)相结合。
我从未见过这样的代码,虽然技术上有效,但我会立即纠正。即使您正在创建线程实例,您也会将其传递给另一个线程并启动后者。那么为什么要在第一个位置创建第一个线程呢?请注意,Thread
也会实现Runnable
,因此技术上有效,但实在太尴尬。
那我该推荐什么?实现未与线程耦合的Runnable
接口。您不能单独在一个单独的线程中运行 Runnable
,您必须显式创建该线程。但是,使用原始Runnable
还可以轻松地从本机线程切换到例如线程池。
从技术上讲,你可以扩展Thread
并将这样的“runnable”放在一个线程池中,但这真的很难理解,你也不必携带Thread
行李(这是一个很大的课程) )。