2015-07-16 1 views
0

Это часть моей программы. Я убежден, что этот класс, где мой код получает повесил трубку. Я использую тупик в java, и у меня есть трудности.Моя программа зависла, и я не знаю, как исправить ее сейчас

Так что я не хотел отображать весь свой код, но это образец. Может кто-нибудь сказать мне, почему он висит? эта тупиковая ситуация меня сбивает с толку.

public class gameEnemyRelease { 
     private static Object enemy1 = new Object(); 
     public static Object enemy2= new Object(); 

     public static void main(String args[]) { 

      player1 p1 = new player1(); 
      player2 p2 = new player2(); 
     p1.start(); 
      p2.start(); 
     } 

     private static class player1 extends Thread { 
      public void run() { 
      synchronized (enemy1) { 
       System.out.println("Start Launch"); 
       try { Thread.sleep(10); } 
       catch (InterruptedException e) {} 
       System.out.println("Waiting for enemy 2 to launch..."); 
       synchronized (enemy2) { 
        System.out.println("Shot"); 
       } 
      } 
      } 
     } 
     private static class player2 extends Thread { 
      public void run() { 
      synchronized (enemy2) { 
       System.out.println("..."); 
       try { Thread.sleep(10); } 
       catch (InterruptedException e) {} 
       System.out.println(""); 
       synchronized (enemy1) { 
        System.out.println(""); 
       } 
      } 
      } 
     } 
    } 
+1

http://stackoverflow.com/help/how-to-ask – KevinDTimm

+0

Я прочитал это. Мне просто нужна помощь в том, почему мой код висит. –

+1

вы запираетесь в точно противоположном порядке в обоих потоках. скажем, оба выполняются, они оба фиксируют соответствующий врагX. теперь 'player2' владеет' enemy2', а 'player1' владеет' enemy1', поэтому вызывается синхронизированный println, они не могут быть выполнены, потому что OTHER-файл принадлежит этой блокировке, поэтому они оба ждут друг друга, чтобы освободить замки, которых они не могут. 'player2' пытается сделать' враг1', но должен ждать 'player1'. и игрок1 делает то же самое с врагом2 –

ответ

4

Ваша программа висит, вероятно, потому, что ни одна из нитей не может двигаться дальше и ждать друг друга, чтобы освободить замок. Поэтому вы можете попробовать изменить этот метод; Попробуйте приведенный ниже код:

private static class player2 extends Thread { 
      public void run() { 
      synchronized (enemy1) { 
       System.out.println("..."); 
       try { Thread.sleep(10); } 
       catch (InterruptedException e) {} 
       System.out.println(""); 
       synchronized (enemy2) { 
        System.out.println(""); 
       } 
      } 
4

Подумайте об этом пути кода:

  • Thread 1 замки Enemy 1
  • резьбы 2 замка врага 2
  • Threads 1 попытка заблокировать врага 2, но блокируется потоком 2, так он ждет
  • Thred 2 попытаться заблокировать врага 1, но заблокирован нитью 1, поэтому он ждет

Вам нужно обратиться и, возможно, заблокировать обоих врагов с самого начала.

Смежные вопросы