Java线程基础知识

时间:2012-03-10 19:11:21

标签: 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(){}
}

1 个答案:

答案 0 :(得分:9)

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

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行李(这是一个很大的课程) )。