java - 这段代码出现线程死锁了吗?如果有是什么原因?
巴扎黑
巴扎黑 2017-04-17 17:56:05
0
2
275

Film.java

package FilmTest;

public class Film {
    private String name;
    private boolean flag = true;

      public synchronized void play(String name) {
          if(!flag){
              try {
                this.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          }
          try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          System.out.println("producer-1"+name);
          this.name = name;
         // System.out.println(name);
          this.notify();
          this.flag = false;
      }
      
      public synchronized void watch() {
          if(flag){
              try {
                this.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          }
          try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          
          System.out.println("watcher-2"+name);
         this.notify();
          this.flag = true;
      }
      }
      

Player.java

package FilmTest;

public class Player implements Runnable {
    private Film film;
    public Player(Film film) {
        // TODO Auto-generated constructor stub
     this.film = film;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int i=0;i<20;i++){
            if(0==i%2){
                film.play("film-1-"+i);
            }else{
                film.play("film-2-"+i);
            }
            
        }
    }
}

Watcher.java

package FilmTest;

public class Watcher implements Runnable {
    private Film film;
    public Watcher(Film film) {
        super();
        this.film = film;
    }
    @Override
    public void run() {
        film.watch();
    }

}

MainTest.java

package FilmTest;

public class MainTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Film film = new Film();
        Player player = new Player(film);
        Watcher watcher = new Watcher(film);
        new Thread(player).start();
        new Thread(watcher).start();
    }

}

执行结果如下, 出现下面内容代码还是运行状态

producer-1film-1-0
watcher-2film-1-0
producer-1film-2-1

感觉出现了死锁 ,但不知道问题出在哪里,求指教

巴扎黑
巴扎黑

membalas semua(2)
刘奇

Ini bukan kebuntuan, terdapat masalah dengan kod anda.
Selepas anda mencetak producer-1film-2-1, flag = false, maka play akan dilaksanakan pada kali seterusnya anda melaksanakan kaedah this.wait(), dan kaedah itu tidak akan dibangkitkan selepas itu dan akan sentiasa berada dalam keadaan wait. Jadi tiada keluaran maklumat bercetak selepas itu.

伊谢尔伦

flim.playwait() dalam kaedah tidak sabar untuk bangun

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan