JUC学习笔记——进程与线程( 三 )

使用 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方法
最后我们介绍一下使用Runnable的好处:
  • 方法1 是把线程和任务合并在了一起,方法2 是把线程和任务分开了
  • 用 Runnable 更容易与线程池等高级API 配合
  • 用 Runnable 让任务类脱离了 Thread 继承体系,更灵活
使用FutureTask 配合 Thread(了解即可)FutureTask 能够接收 Callable 类型的参数,用来处理有返回结果的情况:
// 创建任务对象(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的值 。
多线程运行状况我们给出单核CPU运行多线程时不断切换进程的状况展示:
// 下述的操作不受我们控制,谁先调用,调用多久都不是我们管控的@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