本帖最后由 星辉祝愿 于 2015-5-28 23:22 编辑
线程间通信:多个线程在操作同一个资源,但是操作的动作却不一样。 设计思路 1:将资源封装成对象。 2:将线程执行的任务(任务其实就是run方法。)也封装成对象。 3:两个动作必须要同步资源。
等待唤醒机制:涉及的方法: wait:将同步中的线程处于冻结状态。释放了执行权,释放了资格。同时将线程对象存储到线程池中。 notify:唤醒线程池中某一个等待线程。 notifyAll:唤醒的是线程池中的所有线程。 注意: 1:这些方法都需要定义在同步中。 2:因为这些方法必须要标示所属的锁。 你要知道 A锁上的线程被wait了,那这个线程就相当于处于A锁的线程池中,只能A锁的notify唤醒。 3:这三个方法都定义在Object类中。为什么操作线程的方法定义在Object类中?
因为这三个方法都需要定义同步内,并标示所属的同步锁,既然被锁调用,而锁又可以是任意对象,那么能被任意对象调用的方法一定定义在Object类中。
- /*
- 实现进程间的切换,输入一个人信息,就打印一个人信息
- */
- class Person
- {
- private String name;
- private String sex;
- private boolean flag = false;
- //输入
- public synchronized void set(String name,String sex)
- {
- if(flag)
- try{this.wait();}catch(Exception e){}//等待notify唤醒
- this.name = name;
-
- this.sex = sex;
- flag = true;
- this.notify();//唤醒 本方线程
- }
- //输出
- public synchronized void out()
- {
- if(!flag)
- try{this.wait();}catch(Exception e){}//等待notify唤醒
- System.out.println("姓名:"+name+",性别:"+sex);
- flag = false;
- this.notify();//唤醒 本方线程
- }
- }
- class Input implements Runnable
- {
- private Person p ;
- Input(Person p)
- {
- this.p = p;
- }
- public void run()
- {
- int x = 0;
- while(true)
- {
- if(x==0)
- p.set("小吴","男");
- else
- p.set("王莉莉","女");
- x = (x+1)%2;
- }
- }
- }
复制代码 运行结果:姓名:小吴,性别:男 姓名:王莉莉,性别:女 姓名:小吴,性别:男 姓名:王莉莉,性别:女
|