Java多线程(三)进入多线程的世界

96 阅读2分钟

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

前言

上一篇章中我们讲了cpu的工作方式与时间片是什么,上下文切换是什么,本篇章我们将进入多线程的世界,new一个多线程来为我们所用。

image.png

线程的状态

线程的状态总共有七种:new 新生 runnable 就绪 Running 运行 blocked 阻塞 time waiting 时间等待 waiting 等待 dead 消亡

线程会在就绪、运行、阻塞、等待这几个当中徘徊,然后最后消亡,结束线程的一生。

这里的等待有两种,等待是指线程在某个时间点进入等待,然后等待其他线程的回应,如果有回应这个线程就会回到就绪状态,等待cpu重新调度。而时间等待是可以不等待其他线程的回应,只要到达了设定的时间,会自动唤醒该线程。

Class Thread

类 线程,顾名思义,Thread是个类,这个类就是Java中开辟线程的其中一种方式,Thread类它实现了Runnable接口,而这Runnable也是开辟线程的其中一种方式。Thread是new出来的线程并不是立刻就从主分支分开开始执行任务,是要等待你调用start方法然后还要在等CPU的调度,也就是说start了只能说就绪了,等待cpu给你新开的线程来分配时间片,不然你的线程就会一直等待。

使用Thread的来创建一个简单的线程: 只需要用去继承Thread类然后重写run方法就行

public class ThreadTest extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            System.out.println(“testtest”);
        }
    }
    
    main(){
        ThreadTest thread = new ThreadTest();
        thread.start(); // 这里要使用start方法,如果使用run方法就变成了普通调用了!
    
    }
}

interface Runnable

Runnable 看标题就知道他是一个接口,上面我们讲了Thread类是需要继承才可以创建线程,但众所周知Java是单继承,没有办法多继承,但是可以多实现。Runnable不仅是一个接口,它还是一个函数式接口,这就意味着我们只需要用lambda表达式就可以调用方法,所以Runnable也是众多java开发常用的创建线程方式,但是创建出来的线程与上面的Thread类一样,并不会马上去执行,还是要看Cpu心情的哦。

Runable接口创建一个简单线程:

new Thread(()->{
    System.out.println("看线程创建就这么快");
}, "thread1").start(); // 注意这个Start不写这就是个空壳线程哦

总结

  1. Thread new出来的是个空壳子,那个对象并不是new出来就可以被cpu调度的。
  2. Runable接口借用lambda的优势可以简化线程的创建
  3. 线程的状态会时刻发生变化