2022-08-03 第六小组 高佳誉 学习笔记

多线程基础和锁

重点

  1. 创建线程
  2. 线程的生命周期
  3. 死锁
  4. sleep和wait的区别

思维导图

知识点

1. 创建线程

(1)继承Thread类,并且重写run方法
(2)实现Runnable接口
(3)实现Callable接口


2.守护线程

Java中提供两种类型的线程:
(1)用户线程
(2)守护程序线程
守护线程为用户线程提供服务,仅在用户线程运行时才需要
主方法可以理解成用户线程,自己创建的可以理解成守护程序线程
守护线程自己无法启动,服务于用户线程
守护线程对于后台支持的任务非常有用。
垃圾回收。大多数JVM线程都是守护线程。

3. 线程的生命周期

NEW:这个状态主要是线程未被start()调用执行
RUNNABLE:线程正在JVM中被执行,等待来自操作系统的调度
BLOCKED:(锁)阻塞。因为某些原因不能立即执行,需要挂起等待
WAITING:无限期等待。Object类,如果没有唤醒,则一直等待。
TIMED_WAITING:有限期等待,线程等待一个指定的时间
TERMINATED:终止线程的状态,线程已经执行完毕

4. 同步代码块

(1)首先要选好同步监视器(同步锁),选好用哪一个对象,推荐使用类对象,第三方对象,this。
(2)在实现接口创建的线程类中,同步代码块是不可以用this来充当同步锁的。推荐使用类对象。

5. 死锁

多个线程同时被阻塞,他们中的一个或者全部都在等待某个资源的释放右玉县城无限期的阻塞,程序就不可能正常终止。
在Java中死锁产生的四个必要条件
1.互斥使用:当资源被一个线程使用(占用),别的线程不能使用
2.不可抢占:资源的请求者不能强制从占有者中抢夺资源,资源只能从占有者手动释放
3.请求和保持
4.循环等待:通常会存在一个等待的队列。例如P1占有了P2的资源,P2占有了P3的资源,P3占有了P1的资源。形成了一个等待环路。

6. sleep和wait的区别

1.出处:sleep是Thread;wait是Object
2.对于锁的控制

案例:生产者与消费者模型
有两条线程。一条线程生产产品,另一条线程消费产品
这两条线程,初始状态是什么情况
点击查看代码
package com.jsoft.night;
class BaoZi{
    boolean flag=false;//包子是否存在 true有包子 消费 flase 没包子 生产
    String pier;
    String xian;
    public BaoZi() {
    }
    public BaoZi(String pier, String xian) {
        this.pier = pier;
        this.xian = xian;
    }
    //生产包子
    public synchronized void productBaoZi(){
        if(flag==true){//有包子
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //生产
        System.out.println("包子铺开始做包子");
        System.out.println("包子作好了"+this.pier+this.xian);
        flag=true;
        notify();//通知对方开始吃包子
    }
    //消费包子
    public synchronized void eatBaozi(){
        if(!flag){//包子没作做好
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("吃货正在吃包子"+this.pier+this.xian);
        System.out.println("====================");
        flag=false;
        notify();//通知对方做包子
    }
}
public class BaoZiPuTest {
    public static void main(String[] args) {
        BaoZi bz = new BaoZi("薄皮", "牛肉");
        //生产线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    //生产包子需要时间
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    bz.productBaoZi();
                }
            }
        }).start();
        //消费线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    bz.eatBaozi();
                }
            }
        }).start();
    }
}

掌握程度

多线程了解的还算可以,创建线程,控制线程也没有太大的问题,但是容易出现锁不住的问题。 自我建议:多做练习题

收获

良好的心态是成功的基础,冷静的思考是成功的必要条件

学习效果展示

posted @ 2022-08-04 09:03  憨憨的时倾  阅读(34)  评论(0)    收藏  举报