java线程唤醒与等待_Java线程的等待与唤醒
生產(chǎn)者和消費(fèi)者必須使用同步代碼塊包裹起來,保證等待和喚醒只能有一個(gè)執(zhí)行,同步使用的鎖對(duì)象必須保證唯一
Thread中重要方法
void wait() 在其他線程調(diào)用此對(duì)象的notify()方法或notifyall()方法前,導(dǎo)致當(dāng)前線程等待
void notify() 喚醒在此對(duì)象監(jiān)視器上等待的單個(gè)線程后,會(huì)繼續(xù)執(zhí)行wait方法之后的代碼
void notifyAll() 喚醒所有等待線程
void wait(long m)在毫秒結(jié)束之后,還沒有被notify喚醒,就會(huì)自動(dòng)醒來,線程睡醒進(jìn)入到Runnable/blocke狀態(tài)
void sleep(long m)在毫秒結(jié)束之后,線程睡醒進(jìn)入到Runnable/blocke狀態(tài)
使用
我們自己創(chuàng)建線程類的子類時(shí),不要忘了寫上繼承extend。再run()方法中寫入線程同步的代碼,在客戶端調(diào)用時(shí),直接調(diào)用start方法,默認(rèn)自動(dòng)調(diào)用run方法的代碼。
實(shí)例
產(chǎn)品類
public class Product {
//屬性代表該產(chǎn)品是否還有
boolean flag=false;
}
//生產(chǎn)者類
public class Producer extends Thread{
private Product pr;
//構(gòu)造有參構(gòu)造函數(shù),讓產(chǎn)品類實(shí)例的對(duì)象作為鎖對(duì)象
public Producer(Product pr){
this.pr=pr;
}
@Override
public void run() {
//一直生產(chǎn)該商品
while (true){
//使用鎖對(duì)象
synchronized (pr){
//如果該產(chǎn)品還存在,
if(pr.flag==true){
try {
//生產(chǎn)者停止生產(chǎn)
pr.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//否則生產(chǎn)者開始生產(chǎn)
System.out.println("生產(chǎn)者正在生產(chǎn)");
try {
//生產(chǎn)時(shí)間為5秒
Thread.sleep(5000);
System.out.println("請(qǐng)等待5秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
//生產(chǎn)完成
pr.flag=true;
//喚醒消費(fèi)者
pr.notify();
System.out.println("生產(chǎn)者生產(chǎn)完了,消費(fèi)之開始使用");
}
}
}
}
//消費(fèi)者類
public class Consumer extends Thread{
private Product pr;
//鄭州人流醫(yī)院 http://mobile.zzzzyy120.com/
public Consumer(Product pr){
this.pr=pr;
}
@Override
public void run() {
//消費(fèi)者一直消費(fèi)產(chǎn)品
while (true){
//鎖對(duì)象
synchronized (pr){
//如果產(chǎn)品沒有了
if (pr.flag==false){
try {
//則消費(fèi)者進(jìn)行等待
pr.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果產(chǎn)品還有,消費(fèi)者使用產(chǎn)品
System.out.println("消費(fèi)者正在使用");
//消耗完產(chǎn)品,改變產(chǎn)品屬性
pr.flag=false;
//喚醒生產(chǎn)者,等待再次生產(chǎn)產(chǎn)品
pr.notify();
System.out.println("產(chǎn)品已經(jīng)使用完了,生產(chǎn)者開始生產(chǎn)");
}
}
}
}
//主函數(shù)
public static void main(String[] args) {
//實(shí)例化產(chǎn)品
Product pr=new Product();
//實(shí)例化生產(chǎn)者,并運(yùn)行run方法
new Producer(pr).start();
//實(shí)例化消費(fèi)者,并運(yùn)行run方法
new Consumer(pr).start();
}
運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的java线程唤醒与等待_Java线程的等待与唤醒的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LeetCode笔记】169. 多数元
- 下一篇: 高德地图画带箭头的线_精选 | 这款充电