关于启动线程位置的一点思考

最近看到两段相似的代码,第一段是

java 复制代码
public class Main {
    public static void main(String[] args) {
        new Thread(() -> {
            doWork();
        }).start();
    }
    
    static void doWork(){
        //执行耗时操作...
    }
}

第二段为

java 复制代码
public class Main {
    public static void main(String[] args) {
        doWork();
    }

    static void doWork() {
        new Thread(() -> {
            //执行耗时操作...
        }).start();
    }
}

两段代码的差别仅在启动线程的位置。

有时候写程序比较随意的时候,两种形式的代码都可以可能出现,下面记录下我对这种形式的一些想法。

第一种:由调用方来控制线程启动

这种对应上述在main方法中启动线程的情形。这种形式最初看到的时候是在Android的一个Activity的代码里,因为Activity的诸多方法运行在主线程中,如果执行耗时操作,那么就会导致ANR程序不响应,那么就会把一些认为是耗时的操作放在其他线程中,于是就有了类似的代码:

java 复制代码
public class DemoActivity extends Activity{

    @Override
    protected void onResume() {
        super.onResume();
        new Thread(() -> {
            xxManager.startDoWorks();
        }).start();
    }
}

第二种:由实现方来控制线程启动

这种对应上述第二种在doWork方法中启动线程的情形。这种代码最初是在一个Controller的代码中看到,因为这个类中包含了一些网络和文件访问的操作,所以接口方法都另起线程来执行:

java 复制代码
public class DemoController{

    public void doXXXWork(Callback callback){
        new Thread(() -> {
            //执行耗时操作...
        }).start();
    }
}

对比和思考

虽然两种代码我都写过,但我还是倾向于后者由实现方来控制线程启动。理由如下:

  1. 实现方知道内部代码的具体实现,可以决定内部代码在哪种类型的线程中执行。而调用方需要查看实现方的代码才能知道。
  2. 实现方对实现的代码有着控制权,可以变更代码实现,根据实现方式来调整线程的使用。
  3. 调用方去改变外部代码的线程上下文有点越权的感觉,这不应该是调用方的职责。
相关推荐
不是万能的豆学长3 小时前
排查Go服务40天后的内存泄漏问题
开发语言·后端·golang·go
阿狗童鞋3 小时前
SpringSecurity权限认证实战指南
java·后端·spring
码匠许师傅3 小时前
【C++三方组件】libpqxx:PostgreSQL 的 C++ 客户端
开发语言·c++·postgresql
Wang's Blog3 小时前
Java 项目部署之 Docker工具快速入门: 学习路径与命令速查导引
java·学习·docker
H.莓飛3 小时前
【C++】内存管理
linux·开发语言·jvm·c++·visual studio
tachibana23 小时前
Go 语言 Map 的底层实现原理
开发语言·后端·golang·make
白帽攻防录3 小时前
SRC 挖洞:Android 蓝牙预认证 RCE 深度复盘,CVE-2026-55330 怎么在蓝牙范围内零交互攻破手机
android·网络安全·智能手机·src漏洞挖掘
Wang's Blog3 小时前
Java 项目部署之 Docker工具快速入门: Docker 镜像仓库
java·docker
心仪久了会沦陷3 小时前
C语言数据结构入门——队列补充:循环队列的数组实现
c语言·开发语言·数据结构·笔记
企智汇-项目管理软件3 小时前
离散制造管理系统怎么选?一套系统管住从研发到交付的全周期
java·人工智能·制造·项目经理·项目管理软件·项目管理系统·项目管理软件工程