老师,看看注释是不是这样运行的
package com.icoom.model;
public class Test {
int n=0;
boolean flag=false;
public synchronized int get(){
/**
* 第一次!flag等于true,执行wait方法等待线程(get方法所有代码不执行)
* set方法唤醒后,此时flag是!true,不执行wait,输出第一次消费信息,再次将flag赋值为false,
* 并且唤醒set方法线程,然后再次判断,此时flag为flash,从而执行wait方法等待
*/
if(!flag){
try{
wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
System.out.println("消费"+n);
flag=false;
notifyAll();
return n;
}
public synchronized int set(){
/**
* 第一次false,不执行wait等待方法,并且输出生产信息,
* 将false设置为true,并且唤醒get的线程,然后再次判断if,此时flag为true,执行wait等待,
*/
if(flag){
try{
wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
System.out.println("生产"+n);
this.n=n;
flag=true;
notifyAll();
}
}
正在回答
同学你好,1. 同学理解是正确的,是这样运行的。
2. 同学是想问,为什么循环调用get或者set方法后不直接执行完而是执行另个一个方法吗?如果是,则是因为每次线程执行完后,线程会进行休眠,如下图所示:此时很大程度上另一个线程会获得cpu执行权进行执行。如果不是,请同学重新描述一下。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星