- 線程
單線程
```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();
}
}
- 線程池原理