线程间通信的一个小例子

两个线程,一个写入,一个读取:
package tst.thread;
public class InputOutput {
    public static void main(String[] args) {
        Res r = new Res();
                                              
        new Thread(new Input(r)).start();
        new Thread(new Output(r)).start();
    }
}
class Input implements Runnable {
    Res r;
    public Input(Res r) {
        this.r = r;
    }
                                          
    public void run() {
        int x = 0;
        while(true) {
            if(x == 0) {
                r.setInfo("小明", "男");
            } else {
                r.setInfo("小红", "女");
            }
            x = (x + 1) % 2;
        }
    }
}
class Output implements Runnable {
    Res r;
    public Output(Res r) {
        this.r = r;
    }
                                          
    public void run() {
        while(true) {
            r.showInfo();
        }
    }
}
class Res {
    private String name;
    private String sex;
    boolean flag = false;
                                          
    public synchronized void setInfo(String name,String sex) {
        if(flag) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        this.name = name;
        this.sex = sex;
        flag = true;
        this.notify();
    }
                                          
    public synchronized void showInfo() {
        if(!flag) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println("The name is " + this.name + ",the sex is " + this.sex);
        flag = false;
        this.notify();
    }
}

当多线程是多个写入,多个读取,若按上述操作则可能出现所有线程同时等待。这时判断flag应该为while,而不用if,并改notify()为notifyall()!下为例子:

package tst.thread;
public class ProCon {
    public static void main(String[] args) {
        Resource r = new Resource();
          
        Pro p1 = new Pro(r);
        Pro p2 = new Pro(r);
        Cons p3 = new Cons(r);
        Cons p4 = new Cons(r);
          
        Thread t1 = new Thread(p1);
        Thread t2 = new Thread(p2);
        Thread t3 = new Thread(p3);
        Thread t4 = new Thread(p4);
          
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
class Resource {
    private String proname = "Product--";
    private int count = 0;
    private boolean flag = false;
      
    public synchronized void pro() {
        while(flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName() + "==" + proname + "生产---" + ++count);
        flag = true;
        this.notifyAll();
    }
      
    public synchronized void con() {
        while(!flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName() + "==" + proname + "消费------" + count);
        flag = false;
        this.notifyAll();
    }
}
class Pro implements Runnable {
    Resource r;
    public Pro(Resource r) {
        this.r = r;
    }
    public void run() {
        while(true) {
            r.pro();
        }
    }
      
}
class Cons implements Runnable {
    Resource r;
    public Cons(Resource r) {
        this.r = r;
    }
    public void run() {
        while(true) {
            r.con();
        }
    }
}


你可能感兴趣的:(java,线程)