Java线程基础知识

sra*_*001 4 java multithreading

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

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

Tom*_*icz 9

第一种方法是可以接受的,但是气馁.第二个有效,但很难理解.考虑第三个:

class ServerRunnable implements Runnable {
  public void run(){}
}

Runnable run = new ServerRunnable();
Thread serverThread = new Thread(run);
serverThread.start();  //#3
Run Code Online (Sandbox Code Playgroud)

#1

这是非常常见的方法 - 为了创建一个新线程,您只需将其子类化并调用start()方法.许多人,包括我自己,都认为这种习惯是一种糟糕的习惯 - 它不必要地将任务(run()方法的内容)与线程(Thread类)相结合.

#2

我从未见过像这样的代码,虽然技术上有效,但我会立即纠正.即使您正在创建一个线程实例,您也将它传递给另一个线程并启动后者.那么为什么要在第一个位置创建第一个线程呢?请注意,它Thread也实现Runnable,所以它在技术上有效,但真的很尴尬.

#3

那么我推荐什么?实现Runnable未耦合到线程的接口.你无法运行 Runnable单独在一个单独的线程,你必须明确地创建一个线程.但是拥有raw Runnable还可以让您轻松地从本机线程切换到例如线程池.

从技术上讲,你可以扩展Thread并在线程池中放置这样一个"可运行",但这很难理解,你也不必要地携带Thread行李(这是一个非常大的课程).