使用 Runnable 配合 Thread这里我们将Thread里面的方法采用Runnable类型的方法来代替:
// 创建Runnable类型的方法Runnable runnable = new Runnable() {public void run(){// 要执行的任务}};// 创建线程对象Thread t = new Thread( runnable );// 启动线程t.start();
我们给出一个实际例子:
// 创建任务对象Runnable task2 = new Runnable() {@Overridepublic void run() {log.debug("hello");}};// 参数1 是任务对象; 参数2 是线程名字,推荐Thread t2 = new Thread(task2, "t2");t2.start();
【JUC学习笔记——进程与线程】其结果为:
// 结果正常9:19:00 [t2] c.ThreadStarter - hello
除此之外,我们在JDK8之后,我们可以采用函数式接口Lambda来简化Runnable的书写:
// 创建任务对象Runnable task2 = () -> log.debug("hello");// 参数1 是任务对象; 参数2 是线程名字,推荐Thread t2 = new Thread(task2, "t2");t2.start();
甚至我们都不用定义task,来直接采用Lambda方法书写Thread中的task:
// 参数1 是任务对象; 参数2 是线程名字,推荐Thread t2 = new Thread(() -> log.debug("hello"), "t2");t2.start();
底层简单解释:
- 至于Thread为什么能够直接调用Runnable
- Thread在接收Runnable类型后,会将其赋值在this.target
- 而Thread的run方法会先来判断是否存在target,如果存在就直接采用target方法
- 方法1 是把线程和任务合并在了一起,方法2 是把线程和任务分开了
- 用 Runnable 更容易与线程池等高级API 配合
- 用 Runnable 让任务类脱离了 Thread 继承体系,更灵活
// 创建任务对象(Integer是返回对象)FutureTask<Integer> task3 = new FutureTask<>(() -> { log.debug("hello"); return 100;});// 参数1 是任务对象; 参数2 是线程名字,推荐new Thread(task3, "t3").start();// 主线程阻塞,同步等待 task 执行完毕的结果Integer result = task3.get();log.debug("结果是:{}", result);
我们给出结果:19:22:27 [t3] c.ThreadStarter - hello19:22:27 [main] c.ThreadStarter - 结果是:100
我们给出简单解释:- FutureTask内置了一个Callable对象,初始化方法将指定的Callable赋给这个对象 。
- FutureTask实现了Runnable接口,并重写了Run方法,在Run方法中调用了Callable中的call方法,并将返回值赋值给outcome变量
- get方法就是取出outcome的值 。
// 下述的操作不受我们控制,谁先调用,调用多久都不是我们管控的@Slf4j(topic = "c.TestMultiThread")public class TestMultiThread {public static void main(String[] args) {new Thread(() -> {while(true) {log.debug("running");}},"t1").start();new Thread(() -> {while(true) {log.debug("running");}},"t2").start();}}
我们直接给出结果展示:23:45:26.254 c.TestMultiThread [t2] - running23:45:26.254 c.TestMultiThread [t2] - running23:45:26.254 c.TestMultiThread [t2] - running23:45:26.254 c.TestMultiThread [t2] - running23:45:26.254 c.TestMultiThread [t1] - running23:45:26.254 c.TestMultiThread [t1] - running23:45:26.254 c.TestMultiThread [t1] - running23:45:26.254 c.TestMultiThread [t1] - running23:45:26.254 c.TestMultiThread [t1] - running23:45:26.254 c.TestMultiThread [t1] - running
查看进程线程方法由于不同系统的查看方法不同,我们主要介绍三种类型查看方法Window
- 任务管理器可以查看进程和线程数,也可以用来杀死进程
- tasklist 查看进程 :tasklist| findstr (查找关键字)
经验总结扩展阅读
- Seata 1.5.2 源码学习
- 2023年母亲节学习运有所提升的星座金榜题名
- 第4版 高性能MySQL 第一章 MySQL架构 读书笔记
- Helm干货!速度围观!
- .NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>
- MPC:百万富翁问题
- PGL Paddle Graph Learning 关于图计算&图学习的基础知识概览:前置知识点学习
- JVM学习笔记——内存模型篇
- Linux学习环境搭建流程
- Archlinux + Dwm 配置流程