线程笔记三(线程的睡眠和唤醒)
1.线程流程图:
线程流程图.png2.线程的状态
-
New(新建状态):
Threadn thread =new Thread();
但是没有通过thread.start()
调用; -
Runnable(可以运行的状态):线程已经启动可以运行的,在JVM虚拟机里面是处于运行的状态的
-
Blocked(锁阻塞):当线程试图获取一个锁对象时,而锁对象被其他的线程持有,则该线程进入Blocked状态,只有当该线程持有锁时,才会编程Runnable状态。
-
Waiting(无线等待状态):一个线程在等待另外一个线程执行一个(唤醒)动作时,该线程进入Waiting状态后是不能自动唤醒的,必须等待另外一个线程调用notify或者notifyAll方法才能唤醒。
-
线程等待的方法
void wait() //在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
-
-
Timed Waiting(时间数)计时等待:同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态 将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有
Thread.sleep
、Object.wait
。 -
Teminated(被 终止):因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。
//包子类
public class Bun {
private String bun_kin;
private String bun_depression;
private boolean aBoolean=false;
public Bun() {
}
public Bun(String bun_kin, String bun_depression) {
this.bun_kin = bun_kin;
this.bun_depression = bun_depression;
}
@Override
public String toString() {
return "Bun{" +
"bun_kin='" + bun_kin + '\'' +
", bun_depression='" + bun_depression + '\'' +
'}';
}
public String getBun_kin() {
return bun_kin;
}
public void setBun_kin(String bun_kin) {
this.bun_kin = bun_kin;
}
public String getBun_depression() {
return bun_depression;
}
public void setBun_depression(String bun_depression) {
this.bun_depression = bun_depression;
}
public boolean getaBoolean() {
return aBoolean;
}
public void setaBoolean(Boolean aBoolean) {
this.aBoolean = aBoolean;
}
}
//店铺线程
public class Bun_Boss extends Thread{
private Bun bun;
public Bun_Boss(Bun bun) {
this.bun = bun;
}
@Override
public void run() {
while (true){
synchronized(bun){
if (bun.getaBoolean()==true){
//生产包子
try {
bun.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
bun.setBun_kin("薄皮");
bun.setBun_depression("酱肉");
bun.setaBoolean(true);
bun.notify();
System.out.println("生产完成"+bun.getBun_kin()+bun.getBun_depression()+"包子");
}
}
}
}
//顾客线程
public class Custom extends Thread {
private Bun bun;
public Custom(Bun bun){
this.bun=bun;
}
@Override
public void run() {
while (true){
synchronized(bun){
if (bun.getaBoolean()==false){
try {
bun.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("正在吃包子。。。。。。");
bun.setaBoolean(false);
bun.notify();
System.out.println("又吃完了");
System.out.println("=============");
}
}
}
}
网友评论