Java线程基础

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

下面两个线程调用之间的区别是什么? 这两个电话的行为会相似吗

注意:我没有同时使用#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()
method的内容)与线程(
Thread
class)结合起来

#2 我从未见过这样的代码,虽然技术上可行,但我会立即更正它。即使您正在创建一个线程实例,也要将它传递给另一个线程并启动后者。那么,为什么要首先创建第一个线程呢?请注意,
Thread
还实现了
Runnable
,因此它在技术上是可行的,但实际上很难实现

#3 那我推荐什么呢?实现未耦合到线程的
Runnable
接口。不能单独在单独的线程中运行
Runnable
,必须显式创建该线程。但是,使用raw
Runnable
还允许您轻松地从本机线程切换到实例线程池


从技术上讲,你可以扩展
Thread
并将这样一个“runnable”放在线程池中,但这真的很难理解,而且你也不必要地背着
Thread
的包袱(这是一个相当大的类)。

正如官方资料中所建议的那样:解释很完美,甚至连链接也是如此。所以,每当我想为类创建线程时,Runnable是最好的选择,对吗
和线程必须用于运行可运行对象。我的理解正确吗?@mrb:是的,你是对的。madth3提供的链接对此进行了很好的解释。