首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java线程基础

Java线程基础
EN

Stack Overflow用户
提问于 2012-03-11 03:11:21
回答 1查看 431关注 0票数 4

下面的两个线程调用有什么不同?这两个调用会有相似的表现吗?

注意:我没有同时使用#1和#2,这是最好的选择。

代码语言:javascript
运行
复制
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(){}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-11 03:21:10

第一种方法是可以接受的,但不被鼓励。第二个可以工作,但是坏了/很难理解。考虑第三个问题:

代码语言:javascript
运行
复制
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的负担(这是一个相当大的类)。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9649357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档