Java线程基础
下面两个线程调用之间的区别是什么? 这两个电话的行为会相似吗 注意:我没有同时使用#1和#2,这是最好的选择Java线程基础,java,multithreading,Java,Multithreading,下面两个线程调用之间的区别是什么? 这两个电话的行为会相似吗 注意:我没有同时使用#1和#2,这是最好的选择 private void startConnections(){ ServerThread server = new ServerThread(); server.start(); // #1 Thread serverThread = new Thread(server); serverThread.start(); //#2 } class Serv
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(){}
}
第一种方法是可以接受的,但不可取。第二个可行,但已损坏/难以理解。考虑第三个问题:
class ServerRunnable implements Runnable {
public void run(){}
}
Runnable run = new ServerRunnable();
Thread serverThread = new Thread(run);
serverThread.start(); //#3
#1
这是一种非常常见的方法——为了创建一个新线程,您只需将其子类化并调用start()
方法。很多人,包括我自己,都觉得这个习惯用法很糟糕——它不必要地将任务(run()
method的内容)与线程(Thread
class)结合起来
#2
我从未见过这样的代码,虽然技术上可行,但我会立即更正它。即使您正在创建一个线程实例,也要将它传递给另一个线程并启动后者。那么,为什么要首先创建第一个线程呢?请注意,Thread
还实现了Runnable
,因此它在技术上是可行的,但实际上很难实现
#3
那我推荐什么呢?实现未耦合到线程的Runnable
接口。不能单独在单独的线程中运行Runnable
,必须显式创建该线程。但是,使用rawRunnable
还允许您轻松地从本机线程切换到实例线程池
从技术上讲,你可以扩展
Thread
并将这样一个“runnable”放在线程池中,但这真的很难理解,而且你也不必要地背着Thread
的包袱(这是一个相当大的类)。正如官方资料中所建议的那样:解释很完美,甚至连链接也是如此。所以,每当我想为类创建线程时,Runnable是最好的选择,对吗和线程必须用于运行可运行对象。我的理解正确吗?@mrb:是的,你是对的。madth3提供的链接对此进行了很好的解释。