Java基础笔记-第八记

来源:互联网 发布:易吧进销存软件 编辑:程序博客网 时间:2024/06/06 05:03
Java 线程
wait()
notify()
notifyAll()
都使用在同步中,因为要对持有监视器的线程操作
所以要使用在同步中,因为只有同步才具有锁

为什么这些操作的方法要定义Object类中呢?
因为这些方法在操作同步中线程时,都必须要标识它们所操作线程只有的锁
只有同一个锁上的被 等待纯种,可以被同一个锁上notify() 唤醒
不可以对不同锁中的线程进行唤醒
也就是说,等待和唤醒的必须是同一个锁

例如:
class Res{ //添加资源类private String name;private String sex;//添加同步锁方法,用于设置姓名和年龄public synchronized void set(String name,String sex) {this.name = name;this.sex = sex;}//输出姓名和年龄public void out(){System.out.println(name+"...."+sex);}boolean flag = false; //标识是否已设置,true为已设置,false为未设置}class Input implements Runnable{  //输入线程private Res r ; //引用资源类Input(Res r){ //构造this.r = r;}@Overridepublic void run() {  //线程boolean b = true;   //用于交替添加while(true){synchronized(r){if(r.flag){try { r.wait();} catch (InterruptedException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}if(b){r.set("jack", "男");b = false;} else{r.set("lili", "女");b = true;}r.flag = true;  //标识为已设置r.notify();//唤醒另一个线程,注意,另一个线程锁定的是同一个对象,否则无法唤醒}}}}class Output implements Runnable{ //输出线程private Res r;Output(Res r){this.r = r;}@Overridepublic void run() {while(true){synchronized(r){ //线程锁if(!r.flag){//判断如果没有设置try {r.wait(); //则当前线程等待} catch (InterruptedException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}r.out(); //打印内容r.flag = false;  //打印完成设置标识r.notify();   //唤醒另一个在同一个锁的线程}}}}public class Demo1 {public static void main(String[] args) {Res r = new Res();//创建一个对象,唯一的Input in = new Input(r);  //创建输入线程,将对象传入,此时该线程则以该对象为锁Output out = new Output(r);//创建输出线程,将对象传入,此时该线程则以该对象为锁Thread t1 = new Thread(in);Thread t2 = new Thread(out);t1.start();t2.start();}}


0 0
原创粉丝点击