JUC并发编程 -- 线程常用方法概述 & start() vs run()

Posted Z && Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUC并发编程 -- 线程常用方法概述 & start() vs run()相关的知识,希望对你有一定的参考价值。

1. 线程常用方法概述



2. start() vs run()


2.1 run()方法

测试代码:

import lombok.extern.slf4j.Slf4j;

@Slf4j(topic = "c.Test4")
public class Test4 {
    public static void main(String[] args) {
        Thread t1 = new Thread("t1") {
            @Override
            public void run() {
                log.debug(Thread.currentThread().getName());
                try {
//                  让当前线程休眠3s
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        t1.run();
        log.debug("do other things ...");
    }
}

运行结果:

  • 即使是调用t1线程的run方法,程序仍在 main 线程运行

2.2 start()方法

运行结果:

  • 调用t1线程的start方法,程序在 t1 线程运行

2.3 小结

  • 直接调用 run 是在主线程中执行了 run,没有启动新的线程
  • 使用 start 是启动新的线程,通过新的线程间接执行 run 中的代码

2.4 补充:

连续调用2次start()方法,程序会报错

运行结果:

start方法对线程状态的影响:

import lombok.extern.slf4j.Slf4j;

@Slf4j(topic = "c.Test4")
public class Test4 {
    public static void main(String[] args) {
        Thread t1 = new Thread("t1") {
            @Override
            public void run() {
                log.debug(Thread.currentThread().getName());
            }
        };
        System.out.println("t1线程调用start方法前, t1的状态为: " + t1.getState());
        t1.start();
        System.out.println("t1线程调用start方法后, t1的状态为: " + t1.getState());
    }
}

run方法对线程状态的影响(无影响):



以上是关于JUC并发编程 -- 线程常用方法概述 & start() vs run()的主要内容,如果未能解决你的问题,请参考以下文章

JUC并发编程 -- 线程常用方法之sleep() & yield() & 线程优先级 & sleep方法应用: 限制对 CPU 的使用

JUC并发编程 -- 线程常用方法之join()详解 & join同步应用 & join限时同步

JUC并发编程 共享模式之工具 JUC 线程安全的集合类 -- 线程安全的集合类概述

并发编程-阻塞队列&JUC常用工具

JUC并发编程 -- 观察线程运行的现象 & 查看进程线程的方法

JUC并发编程 -- 常见的线程安全类 & 线程安全类方法的组合 & 不可变类线程安全性