java新手,求助
自己想的一个问题,有关生产者消费者的。消费者为Hand,生产者为make,物品为meat通过synchronized同步块来控制我想通过对meat的加减来实现。可是改了好...
自己想的一个问题,有关生产者消费者的。
消费者为Hand,生产者为make,物品为meat
通过synchronized同步块来控制
我想通过对meat的加减来实现。可是改了好多次,都是直接不动了,啥也不输出,也没有结束。
不知道哪里不对,还是我的那个思路就是错的,在java里面不能用。大神来帮帮忙
public class Test{
public static void main(String[] args){
hand a=new hand("left");
// hand b=new hand("right");
make c=new make();
a.start();
// b.start();
c.start();
}
}
class meat{
static Object pan= new Object();
static int meat=0;
}
class hand extends Thread{
String ha;
hand(String ha){
this.ha=ha;
}
void eat(){
synchronized(meat.pan){
if(meat.meat==0){
System.out.println("还没有做出来,等一会!");
}
try{
meat.pan.wait();
}catch(InterruptedException ie){}
}
}
public void run(){
while(meat.meat>0){
meat.meat--;
System.out.println(ha+"拿了肉,"+"还剩"+meat.meat+"块肉!");
eat();
try{
sleep(1000);
}catch(InterruptedException ie){}
}
}
}
class make extends Thread{
void make(){
synchronized(meat.pan){
meat.meat++;
System.out.println("肉做好了,快来拿吧!");
meat.pan.notify();
}
}
public void run(){
while(meat.meat<2){
make();
try{
sleep(200);
}catch(InterruptedException e){}
}
}
} 展开
消费者为Hand,生产者为make,物品为meat
通过synchronized同步块来控制
我想通过对meat的加减来实现。可是改了好多次,都是直接不动了,啥也不输出,也没有结束。
不知道哪里不对,还是我的那个思路就是错的,在java里面不能用。大神来帮帮忙
public class Test{
public static void main(String[] args){
hand a=new hand("left");
// hand b=new hand("right");
make c=new make();
a.start();
// b.start();
c.start();
}
}
class meat{
static Object pan= new Object();
static int meat=0;
}
class hand extends Thread{
String ha;
hand(String ha){
this.ha=ha;
}
void eat(){
synchronized(meat.pan){
if(meat.meat==0){
System.out.println("还没有做出来,等一会!");
}
try{
meat.pan.wait();
}catch(InterruptedException ie){}
}
}
public void run(){
while(meat.meat>0){
meat.meat--;
System.out.println(ha+"拿了肉,"+"还剩"+meat.meat+"块肉!");
eat();
try{
sleep(1000);
}catch(InterruptedException ie){}
}
}
}
class make extends Thread{
void make(){
synchronized(meat.pan){
meat.meat++;
System.out.println("肉做好了,快来拿吧!");
meat.pan.notify();
}
}
public void run(){
while(meat.meat<2){
make();
try{
sleep(200);
}catch(InterruptedException e){}
}
}
} 展开
3个回答
展开全部
不动了的原因:
public void run(){
while(meat.meat<2){
make();
try{
sleep(200);
}catch(InterruptedException e){}
}
}
当盘里大于等于2块肉的时候,while(meat.meat<2)条件不成立了,不进入下面的代码块了,make线程就结束了,再也不生产了,所以一会就停了
public void run(){
while(meat.meat<2){
make();
try{
sleep(200);
}catch(InterruptedException e){}
}
}
当盘里大于等于2块肉的时候,while(meat.meat<2)条件不成立了,不进入下面的代码块了,make线程就结束了,再也不生产了,所以一会就停了
追问
我把while(meat.meat<2)改为while(true)后,他就一直进行make,吃肉的线程没反应
追答
while(meat.meat>0){
meat.meat--;
System.out.println(ha+"拿了肉,"+"还剩"+meat.meat+"块肉!");
eat();
try{
sleep(1000);
}catch(InterruptedException ie){}
}
吃肉的同样的道理,
当盘里等于0块肉的时候,while(meat.meat>0)条件不成立了,不进入下面的代码块了,吃肉线程就结束了,再也不吃了,所以一会就停了
展开全部
类名要大写。哎~~看得我头晕,不知道你JAVA基础是怎么学的。
另外,你要进行同步控制的变量怎么申明为静态的呢?在你写的这个代码里它肯定动不了了,把修饰符static去掉。问题好多~~~难道没有报错么?
还有不用声明一个meat类了,你直接在整个程序区里声明一个全局变量meat,
然后在make()方法和eat()方法里就可以对它进行操作了
另外,你要进行同步控制的变量怎么申明为静态的呢?在你写的这个代码里它肯定动不了了,把修饰符static去掉。问题好多~~~难道没有报错么?
还有不用声明一个meat类了,你直接在整个程序区里声明一个全局变量meat,
然后在make()方法和eat()方法里就可以对它进行操作了
追问
额…… 新手,自己看书学的……好多基本东西不知道。。。
程序没有报错……就是运行的时候,有时候是:
肉做好了,快来拿吧!
left拿了肉,还剩0块肉!
还没有做出来,等一会!
肉做好了,快来拿吧!
肉做好了,快来拿吧!
left拿了肉,还剩1块肉!
然后程序就完了,更多时候是:
肉做好了,快来拿吧!
肉做好了,快来拿吧!
然后程序就完了……
把static去掉后,编译就不通过了……
如何直接声明全局变量呢?
追答
我感觉要是说我又得费时了~~全局变量就写在Test这个大类的开头好了~
大体思想是这样的~~
我觉得首先你要构造一个缓冲区并且设置大小,用来盛放你的产品----肉。
然后开始走程序 判断缓冲区有产品没有,如果有,进入临界代码区锁定那个全局变量,然后在代码区里面进行全局变量的加减操作。方法执行完再执行你的下一条代码 依旧是首先判断全局变量,是否缓冲区域产品已满,如果满,则不操作,不满,则生产产品并且对变量进行加操作。
生产者消费者就是通过对同一变量进行加减 基于信号量机制来进行消息传递和同步控制的~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
东南大学或者江南大学的自考本科。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询