【Java学习】多线程、线程的创建、生命周期、多线程同步

目录

  • 前言
  • 正文
    • 一、概念
          • (1)进程
          • (2)线程
    • 二、线程的创建
        • (1)Thread类
        • (2)Runnable接口
        • (3)Runnable接口的好处
    • 三、线程的生命周期
        • (1)新建状态(New)
        • (2)就绪状态(Runnable)
        • (3)运行状态(Running)
        • (4)阻塞状态(Blocked)
        • (5)死亡状态(Terminated)
    • 四、线程的调度
        • (1)分类
          • ①分时调度模型
          • ②抢占式调度模型(Java虚拟机默认)
        • (2)优先级
          • 1.数字
          • 2.静态常量
        • (3)休眠
        • (4)线程让步
        • (5)线程插队
    • 五、多线程同步
        • (1)同步代码块
          • 1.定义
          • 2.语法格式
          • 3.缺点
        • (2)同步方法
            • 1.定义
            • 2.语法格式
        • (3)死锁
  • 结语


前言

在我们日常使用的应用程序中,不同的程序块是可以同时运行的,这种多个程序块同时运行的现象称作并发执行。多线程是指一个应用程序中有多条并发执行的线索,每条线索都被称作一个线程,它们会交替执行,彼此间可进行通信。
本文将对Java多线程的一些基础知识进行介绍!

正文

一、概念

(1)进程

在一个操作系统中,每个独立执行的程序都可称为一个进程,也就是“正在运行的程序”。
进程并不是同时运行的,是因为CPU能在极短的时间内在不同的进程之间进行切换,看起来像是在同时运行。

(2)线程

在一个进程中,可以有多个执行单元同时运行,这些执行单元可以看作程序执行的一条条线索,被称为线程。
同进程一样,由CPU轮流执行,并不是同时执行的。

二、线程的创建

(1)Thread类

public class Example01 {
     
    public static void main(String[] args) {
     
        MyThread myThread = new MyThread();     //创建线程MyThread的线程对象
        myThread.start();                       //开启线程
        while (true) {
                               //通过死循环打印输出语句
            System.out.println("main()方法在运行");
        }
    }
}
class MyThread extends Thread{
     
    @Override
    public void run() {
     
        while (true){
                                //通过死循环语句打印输出
            System.out.println("MyThread类的run()方法在运行");
        }
    }
}

(2)Runnable接口

public class Example02 {
     
    public static void main(String[] args) {
     
        MyThread myThread = new MyThread();     //创建MyThread的实例对象
        Thread thread = new Thread(myThread);   //创建线程对象
        thread.start();                         //开启线程,执行线程中的run()方法
        while (true){
     
            System.out.println("main()方法在运行");
        }
    }
}
class MyThread implements Runnable{
     
    @Override
    public void run() {
             //线程的代码段,调用start()方法时,线程从此处开始执行
        while (true){
     
            System.out.println("MyThread类的run()方法在运行");
        }
    }
}

(3)Runnable接口的好处

  • 适合多个相同程序代码的线程去处理同一个资源的情况,把线程同程序代码、数据有效的分离,很好地体现了面向对象的设计思想。
  • 可以避免由于Java单继承带来的局限性。

三、线程的生命周期

【Java学习】多线程、线程的创建、生命周期、多线程同步_第1张图片

(1)新建状态(New)

创建线程对象后,该线程对象就处于新建状态;
此时不能运行,仅仅由Java虚拟机为它分配了内存。

(2)就绪状态(Runnable)

当线程对象调用了 start() 方法 后,该线程就进入了就绪状态;(又称,可运行状态)
此时的线程位于可运行池中,等待着系统的调度。

(3)运行状态(Running)

当处于就绪状态的线程获得了CPU使用权,开始执行 run() 方法中的线程执行体,则该线程处于运行状态;
只有处于就绪状态的线程才可能转换到运行状态。

(4)阻塞状态(Blocked)

当正在执行的线程在某些情况下,会放弃CPU的使用权,进入阻塞状态;
线程从阻塞状态只能进入就绪状态,不能直接进入运行状态;
结束阻塞状态的线程,需要重新进入可运行池中,等待系统的调度。

(5)死亡状态(Terminated)

run() 方法执行完毕;
未捕获的异常 Exception;
错误 Error。

四、线程的调度

(1)分类

①分时调度模型

平均分配每个线程占用的CPU的时间片

②抢占式调度模型(Java虚拟机默认)

让优先级高的线程有限占用CPU,优先级相同的随机选择一个占用。

(2)优先级

1.数字

用1-10之间的整数表示,数字越大,优先级越高。

2.静态常量
Thread类的静态常量 功能描述
static int MAX_PRIORITY 最高优先级,10
staitc int MIN_PRIORITY 最低优先级,1
static int NORM_PRIORITY 普通优先级,5

(3)休眠

  • sleep(long millis) 静态方法
  • 可以使正在执行的线程暂停一段时间,进入休眠等待状态。
  • sleep(long millis) 方法声明抛出 InterruptedException 异常,因此在调用该方法时应该捕获异常,或者声明抛出该异常。
  • sleep() 是静态方法,只能控制当前正在运行的线程休眠,不能控制其他线程。
  • 休眠结束,线程返回就绪状态。

(4)线程让步

  • yield()方法
  • 可使当前线程暂停。
  • 该方法不会阻塞该线程,只是将线程转换成就绪状态,让系统的调度器重新调度一次。
  • 调用该方法后,只有与当前线程优先级相同或更高的线程,才能获得执行的机会。

(5)线程插队

  • join()方法
  • 调用该方法的线程,会“插队”优先执行。

五、多线程同步

(1)同步代码块

1.定义
  • 当多个线程使用同一个共享资源时,可以将处理共享资源的代码放置在一个代码块中,使用 synchronized 关键字修饰。
  • 为了解决线程安全问题。
2.语法格式
synchronized(lock){
     
	操作共享资源代码块	
}

lock: 锁对象
解析:
1.当线程执行同步代码块时,首先检查锁对象的标志位,默认情况下标志位为1,此时线程会执行同步代码块,同时将锁对象的标志位置为0。
2.当一个新的线程执行到这段同步代码块时,由于锁对象的标志位为0,新线程会发生阻塞,等待当前线程执行完同步代码块后,锁对象的标志位被置为1,县线程才能进入同步代码块执行其中的代码。
3.重复过程,直到共享资源被处理完为止。

3.缺点

线程在执行同步代码时每次都会判断锁的状态,非常消耗资源,效率较低。

(2)同步方法

1.定义
  • 使用 synchronized 关键字修饰的方法,称为同步方法。
  • 被 synchronized 修饰的方法在某一时刻只允许一个线程访问,访问该方法的其他线程都会发生阻塞,直到当前线程访问完毕后,其他线程才有机会执行方法。
2.语法格式
synchronized 返回值类型 方法名([参数1,……]) {
     }

(3)死锁

两个线程都需要对方所占用的锁,但都无法释放自己所拥有的锁,于是这两个线程都处于了挂起的状态,从而造成死锁。

结语

以上就是Java多线程的介绍啦,欢迎交流~共同进步!

附上导图:

你可能感兴趣的:(▶IT,———【Java】,多线程,java,导图)