我的程序已挂起,我现在不知道如何修复它

时间:2015-07-16 15:21:55

标签: java multithreading

这是我的计划的一部分。我确信这个课程是我的代码挂断的地方。我在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("");
                }
             }
          }
       } 
    }

2 个答案:

答案 0 :(得分:6)

您的程序挂起可能是因为两个线程都没有继续进行并等待彼此释放锁定。所以你可以尝试改变这个方法;请尝试以下代码:

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("");
                }
             }

答案 1 :(得分:4)

考虑一下这段代码:

  • 线程1锁定敌人1
  • 线程2锁定Enemy 2
  • 线程1尝试锁定敌人2但被线程2锁定,因此等待
  • Thred 2尝试锁定Enemy 1但被线程1锁定,所以等待

你需要解决并且可能从一开始就锁定两个敌人。