A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马--马超 初级黑马   /  2012-8-10 19:28  /  1288 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马--马超 于 2012-8-11 08:47 编辑

问题:

1.为什么不能使用synchronized(s)在生产消费的类中来同步线程,使用之后会报错(无效监视器状态异常),使用同步函数没问题

2.同步函数和同步代码有何区别,分别在何时适用以及优点和缺点,都在什么时候适用?

3.已知Thread类中的stop()方法会造出死锁,如何让这个两个线程停止?

4. 我写的这个程序有什么问题吗?还能做哪些优化(请写出代码)?
           

/*
*        需求:设计生产电脑和搬运电脑类,要求生产一台就搬出一台电脑,如果没有,新的电脑出生产出来,则搬运要等待新电脑产出;
                 如果生产出的电脑没有搬走,则要等待电脑搬走后再生产,并统计出生产的电脑数量
分析:定义一个资源类,用flag标志判断线程运行,用count计算电脑的数量,因为要使用不同的线程操作同一个共享数据,为了避免错误应该使用同步锁,
要实现流水线运行,两个线程开始时应该用标识判断是否wait(),再运行代码,然后wait()修改flag标识唤醒另一个线程
步骤:1.定义一个电脑资源类Res,定义一个布尔类型flag属性初始化为false,定义一个整形count属性表示电脑的数量;
2.定义一个生产类 Producer以线程运行
3.定义一个搬运类 Mover


class Res
{
private int count;
private boolean flag = false;        //初始化标识为false

public synchronized void pro() //定义一个生产方法,并设置函数为同步
{
while(true)  //无限循环执行
{
while(flag)  //判断线程运行标志
{
try{this.wait();}catch(InterruptedException e){} //如果flag为假则让线程进入冻结状态
}        
//如果flag为真则运行以下代码
System.out.println(Thread.currentThread().getName()+"生产电脑---"+count);

flag = true; //以上代码运行一次后重设标志为真
this.notifyAll();//冻结当前线程,并唤醒其他所有线程

}        
}

public synchronized void mov()
{
while(true)
{
while(!flag)
{
try{this.wait();}catch(InterruptedException e){}
}        

System.out.println(Thread.currentThread().getName()+"消费电脑---"+count);
count++;

flag = false;
this.notifyAll();

}        
}
}

class Producer implements Runnable
{
private Res s;
Producer(Res s)
{
this.s = s;        
}
public   void run()
{
s.pro();        
}               
}

class Mover implements Runnable
{
private Res s;
Mover(Res s)
{
this.s = s;        
}
public void run()
{
s.mov();                        
}

}

class ThreadTest7 {
    public static void main(String args[])
    {
            Res s = new Res(); //创建Res类的对象
            Producer pro = new Producer(s);  //新建Producer对象,并调用构造函数将s对象传递到prodducer对象内部,将s的对象传递
            Mover mov = new Mover(s);
            
            Thread pt = new Thread(pro);
            Thread mt = new Thread(mov);
            pt.start();
            mt.start();
            
            
    }
}

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

1 个回复

倒序浏览
没人回答吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马