猿问

java 多线程代码中的一个问题,望解答

  1. class Resource{

  2.    private String name ;

  3.    private String sex ;

  4.    private boolean flag = false;

  5.    public synchronized void set(String name,String sex){

  6.       if(flag )

  7.          try{

  8.            this.wait();

  9.          } catch(InterruptedException e){

  10.              e.printStackTrace();

  11.          }

  12.       this.name = name;

  13.       this.sex = sex;

  14.       flag = true ;

  15.       this.notify();

  16.    }    

  17.     public synchronized void out(){

  18.        if(!flag )

  19.           try{

  20.              this.wait();

  21.           } catch(InterruptedException e){

  22.                 e.printStackTrace();

  23.            }

  24.       System. out.println(name + "..." + sex);

  25.       flag = false ;

  26.       this.notify();

  27.     } 

  28. }

  29. //输入

  30. class Input implements Runnable{

  31.     Resource r;

  32.    Input(Resource r){

  33.       this.r = r;

  34.     }

  35.     public void run(){

  36.       int x = 0;

  37.        while(true ){

  38.          if(x == 0){

  39.             r.set( "mike","男" );

  40.          } else{

  41.              r.set( "lili","女" );

  42.           }

  43.           x = (x + 1)%2;

  44.       }

  45.     }

  46. }

  47. //输出

  48. class Output implements Runnable{

  49.     Resource r;

  50.     Output(Resource r){

  51.        this.r = r;

  52.     }

  53.     public void run(){

  54.        while(true ){

  55.             r.out();

  56.        }

  57.     }

  58. }

  59. class ResourceDemo {

  60.     public static void main(String[] args){

  61.       Resource r = new Resource();//创建资源

  62.       Input in = new Input(r);//创建任务

  63.       Output out = new Output(r);//创建任务

  64.       Thread t1 = new Thread(in);//创建线程,执行路径

  65.        Thread t2 = new Thread(out);//创建线程,执行路径

  66.        t1.start();//开启线程

  67.        t2.start();//开启线程

  68.    }

  69. }

如果flag设为false的话,那为什么if(flag)大括号中的内容还可以运行?

Neilro3534034
浏览 1156回答 1
1回答

甫艾蒽廷

我看了下你这里 synchronized同步的是代码,那么在主函数中要构造两个类(即resource)的对象才可以。
随时随地看视频慕课网APP

相关分类

Java
我要回答