silinga 2017-08-16 09:06 采纳率: 100%
浏览 831
已采纳

多线程程序出现的问题

 package ResourceDemo;
class Resource
{
    private String name;
    private String sex;
    private boolean flag=false;
    public synchronized void set(String name,String sex)
    {
        if(flag)
        {
            try{this.wait();}catch(InterruptedException e){}
        }
    //  else        
    //  {   
            this.name = name;
            this.sex = sex;
            flag=true;
            notify();
    //  }
    }
    public synchronized void get()
    {
        if(!flag)
        {
            try{this.wait();}catch(InterruptedException e){}
        }
        else
        {
            System.out.println(name+"...+..."+sex);
            flag=false;
            notify();
        }       

    }
}
class Input implements Runnable
{
    private Resource r;
    Input(Resource r)
    {
        this.r=r;
    }
    public void run()
    {
        int x=0;
        while(true)
        {
                if(x==0)
                    r.set("Siling","Nan");
                else
                    r.set("司令","女");

                x=(x+1)%2;
        }
    }
}
class Output implements Runnable
{
    private Resource r;
    Output(Resource r)
    {
        this.r=r;
    }
    public void run()
    {
        while(true)
        {
            r.get();
        }
    }
}
public class ResourceDemo
{
    public static void main(String[] args)
    {
        Resource r=new Resource();
        Input a=new Input(r);
        Output b=new Output(r);
        Thread t1=new Thread(a);
        Thread t2=new Thread(b);
        t1.start();
        t2.start();
    }
}

学习多线程,仿照教程敲的代码。flag的作用就是让两个输出语句间隔输出。
上面加注释的else部分,如果有else,就会出现两条语句分别一片一片输出的情况,如果没有else,就正常两条语句分别间隔输出。
可是有没有else理论上有影响吗?

  • 写回答

2条回答 默认 最新

  • Vane11 2017-08-16 11:51
    关注

    问题分几部分,不知道这么讲你能不能懂
    1.如果在有else的正常情况下,计数x不管set执不执行,“司令”这个内容是无论如何都输入不进去的。写入(SiLing),停(女),写入(Ling),停(女)
    2.如果再没有else的情况下,计数x每次变化都会执行set,且第一次set之后都会阻塞,需要等get成功执行后才能执行赋值,所以是间隔输出
    3.如果在有else的非正常情况下,可能发生了set在某次唤醒后,本来是执行 停(女)的操作,但是Flag值被另一个线程又一次改变了,所以成功写入(注意,是可能发生,还可能发生其他情况,和第2个情况不同是因为第二个情况是每次都执行set,没有方法的再次调用过程)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)