java-线程间通信

来源:互联网 发布:制作vpn客户端软件 编辑:程序博客网 时间:2024/06/07 08:42

一.基本的代码
线程间通信
多个线程在操作同一个资源,但是操作的动作不同

package day05;class Res{    String name;    String sex;}class Input implements Runnable{    //构造函数,初始化    private Res r;    Input(Res r)    {        this.r=r;    }    @Override    public void run() {        int x=0;        while(true){        if(x==0)        {            r.name="mike";            r.sex="man";        }        else        {            r.name="丽丽";            r.sex="女女";        }        x=(x+1)%2;    }    }}class Output implements Runnable{     private Res r;    Output(Res r)    {        this.r=r;    }    @Override    public void run() {        // TODO Auto-generated method stub        while(true)         {            System.out.println(r.name+"...."+r.sex);        }    }    }public class Test2 {    public static void main(String[] args) {        // TODO Auto-generated method stub        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();    }}

出错

mike....女女丽丽....女女mike....man丽丽....manmike....manmike....女女

二.增加安全锁
synchronized()
{
}
括号中可以填写的内容是
1.创建object对象
2.Input.class(因为这是唯一的)
3.使用Res r的唯一对象

package day05;class Res{    String name;    String sex;}class Input implements Runnable{    //构造函数,初始化    private Res r;    //Object object=new Object();    Input(Res r)    {        this.r=r;    }    @Override    public void run() {        int x=0;        synchronized (r) {//object        }        while(true){        if(x==0)        {            r.name="mike";            r.sex="man";        }        else        {            r.name="丽丽";            r.sex="女女";        }        x=(x+1)%2;    }    }}class Output implements Runnable{     //Object object=new Object();    private Res r;    Output(Res r)    {        this.r=r;    }    @Override    public void run() {        // TODO Auto-generated method stub        while(true)         {            synchronized (r) {//object            System.out.println(r.name+"...."+r.sex);        }        }    }    }public class Test2 {    public static void main(String[] args) {        // TODO Auto-generated method stub        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();    }}

输出结果正确

原创粉丝点击