黑马程序员技术交流社区
标题: 关于设计一道多线程题的问题 [打印本页]
作者: 黑马--马超 时间: 2012-8-10 19:28
标题: 关于设计一道多线程题的问题
本帖最后由 黑马--马超 于 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();
}
}
作者: 黑马--马超 时间: 2012-8-11 19:39
没人回答吗?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |