JAVA筆記

  • 線程
    單線程

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述


```java
package com.itheima.day10.Thread.WaitAndNotify;
/*
* 資源類:包子類
* 設置包子的屬性
* 皮
* 陷
* 包子的狀態:有true,沒有false
*
* */
public class BaoZi {
    //皮
    String pi;
    //陷
    String xian;
    //包子的狀態:有true,沒有false,設置初始值爲沒有包子
    boolean flag=false;

}

```java
package com.itheima.day10.Thread.WaitAndNotify;

import kotlin.jvm.Synchronized;

/*
*生產者(包子鋪)類:是一個線程類,可以繼承Thread
* 設置線程任務(run):生產包子
* 對包子的狀態進行判斷
* true:有包子
*      包子鋪調用wait方法進入等待狀態
*  false:沒有包子
*       包子鋪生產包子
*       增加一些趣味性:交替生產兩種包子
*           有兩種狀態:(i%2==0)
*       包子鋪生產好了包子
*       修改包子的狀態爲true有
*       喚醒吃貨線程,讓吃貨線程吃包子
*
*  注意:
*       包子鋪線程和包子線程的關係----通信(互斥)
*       必須同時同步技術保證兩個線程只能有一個在執行
*       鎖對象必須保證唯一,可以使用包子對象作爲鎖對象
*       包子鋪類和吃貨的類就需要把包子對象作爲參數傳遞進來
*          1、需要成員位置創建一個包子變量
*          2、使用帶參數構造方法,爲這個包子變量賦值
*
* */
public class BaoZiPu extends Thread{
    //1、需要成員位置創建一個包子變量
   private BaoZi baoZi;
   // 2、使用帶參數構造方法,爲這個包子變量賦值
    public BaoZiPu(BaoZi baoZi) {

        this.baoZi = baoZi;
    }
    //設置線程任務(run):生產包子
    @Override
    public void run() {
        //定義一個變量
        int count=0;
        //讓包子鋪一直生產包子
        while (true){
            //必須同時同步技術保證兩個線程只能有一個在執行
            synchronized (baoZi){
                //對包子的狀態進行判斷
                if (baoZi.flag==true){
                    try {
                        //true:有包子
                        // 包子鋪調用wait方法進入等待狀態
                        baoZi.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //被喚醒之後執行,包子鋪生產包子
                //增加一些趣味性:交替生產兩種包子
                if (count%2==0){
                    //生產 薄皮三鮮餡包子
                    baoZi.pi="薄皮";
                    baoZi.xian="三鮮餡";

                }else {
                    //生產 冰皮牛肉大蔥餡
                    baoZi.pi="冰皮";
                    baoZi.xian="牛肉大蔥餡";
                }
                count++;
                System.out.println("包子鋪正在生產:"+baoZi.pi+baoZi.xian+"包子");
                //生產包子需要3秒鐘
                try {
                    sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //包子鋪生產好了包子
                //修改包子的狀態爲true
                baoZi.flag=true;
                //喚醒吃貨線程,讓吃貨線程吃包子
                baoZi.notify();
                System.out.println("包子鋪已經生產好了:"+baoZi.pi+baoZi.xian+"包子,吃貨可以開始吃啦");


            }
        }

    }
}
package com.itheima.day10.Thread.WaitAndNotify;
/* 消費者(吃貨)類:是一個線程類,可以繼承Thread
*  設置線程任務(run):吃包子
*  對包子狀態進行判斷
*  flase:沒有包子
*  吃貨進入wait等待狀態
*  true:有包子
*  吃貨吃包子
*  吃貨吃完包子
*  修改包子的狀態爲flase沒有
*  吃貨喚醒包子鋪線程,生產包子
* */
public class ChiHuo extends Thread{
    //1、需要成員位置創建一個包子變量
    private BaoZi baoZi;
    // 2、使用帶參數構造方法,爲這個包子變量賦值
    public ChiHuo(BaoZi baoZi) {

        this.baoZi = baoZi;
    }
//設置線程任務(run):吃包子
    @Override
    public void run() {
        //設置死循環,讓吃貨一直吃包子
        while (true){
            //必須同時同步技術保證兩個線程只能有一個在執行
            synchronized (baoZi){
                //對包子的狀態進行判斷
                if (baoZi.flag==false){
                    //吃貨進入wait等待狀態
                    try {
                        baoZi.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //被喚醒之後執行的代碼,吃貨吃包子
                System.out.println("吃貨正在吃:"+baoZi.pi+baoZi.xian+"的包子");
                //吃完了
                baoZi.flag=false;
                //吃貨喚醒包子鋪 線程,生產包子
                baoZi.notify();
                System.out.println("吃貨已經把:"+baoZi.pi+baoZi.xian+"的包子吃完了,包子鋪開始生產包子");
                System.out.println("--------------------------------------------------------------");

            }
        }

    }
}
package com.itheima.day10.Thread.WaitAndNotify;
/*
* 測試類:
* 包含main方法,程序執行的入口,啓動程序
* 創建包子對象
* 創建包子鋪線程,開啓,生產包子
* 創建吃貨線程,開啓,吃包子
* */
public class Demo {
    public static void main(String[] args) {
        // 創建包子對象
        BaoZi baoZi=new BaoZi();
        //創建包子鋪線程,開啓,生產包子
        new BaoZiPu(baoZi).start();
        //創建吃貨線程,開啓,吃包子
        new ChiHuo(baoZi).start();
    }
}

在這裏插入圖片描述

  • 線程池原理

在這裏插入圖片描述

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章