黑马程序员技术交流社区
标题:
关于多线程的问题
[打印本页]
作者:
黑马任雪刚
时间:
2012-5-17 19:55
标题:
关于多线程的问题
//关于多线程件通信--生产者消费者的小程序。
class Res
{
private String name;
private int count=1;
private boolean flag=false;
public synchronized void set(String name)
{
if(flag)
try{wait();}catch(Exception e){}//为什么在这儿被唤醒的|t2不用判断上面的语句,直接进入下一语句??????????
this.name=name+"---"+count++;//在这儿"name+"---"+count++"是怎么赋给this.name的???????????
System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
flag=true;
this.notify();
}
public synchronized void out()
{
if(!flag)
try{wait();}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"消费者"+this.name);
flag=false;
this.notify();
}
}
class Pro implements Runnable
{
private Res r;
Pro(Res r)
{
this.r=r;
}
public void run()
{
int x=0;
while(true)
{
r.set("---商品---");
x=(x+1)%2;
}
}
}
class Con implements Runnable
{
private Res r;
Con(Res r)
{
this.r=r;
}
public synchronized void run()
{
int x=0;
while(true)
{
r.out();
x=(x+1)%2;
}
}
}
public class ProConDemo
{
public static void main(String[] args)
{
Res r=new Res();
Pro p1=new Pro(r);
Con c1=new Con(r);
Thread t1=new Thread(p1);
Thread t2=new Thread(p1);
Thread t3=new Thread(c1);
Thread t4=new Thread(c1);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
作者:
韩国军
时间:
2012-5-18 13:54
if(flag)
try{wait();}catch(Exception e){}
因为刚开始线程判断flag的时候是假,一进来就进入等待状态了。如果把if改为while,线程已唤醒会进行判断的
this.name=name+"---"+count++;
如果是两个线程在进入等待状态,线程唤醒后,两个线程都会在刚开始的count值加1,name就是当前线程的值。
如果两个线程都没有被唤醒,两个线程会在这一直等待下去,直到线程被唤醒。
作者:
付信榕
时间:
2012-5-18 15:07
if(flag)
try{wait();}catch(Exception e){}//为什么在这儿被唤醒的|t2不用判断上面的语句,直接进入下一语句??????????
this.name=name+"---"+count++;//在这儿"name+"---"+count++"是怎么赋给this.name的???????????
System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
这是多线程同步的问题。多线程的出现提高了计算机各方面的效率,带来很多好处。其中就有可以让多个程序或线程并发执行。其原理就是:单个cpu是来回切换执行多个程序(线程)达到肉眼的同时执行即并发执行的。计算机配有文件(pcb)记录程序(线程)执行的各种情况包括执行进度,用于cpu下次再来执行它时,可以正确的从断点进行。所以在这儿被唤醒的|t2不用判断上面的语句,直接进入下一语句。而在这儿"name+"---"+count++"是怎么赋给this.name的只是普通的与this.name=name;一样的赋值原理,count只是个记数值,用于区别一下名字的作用而已。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2