Java线程基础知识

下面两个线程调用有什么区别? 这两个电话会同样行事吗?

注意:我没有同时使用#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(){} } 

第一种方法是可以接受的,但不鼓励。 第二个有效,但很难理解。 考虑第三个:

 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 baggage(这是一个非常大的类)。