2011-12-22 68 views
-1

在阅读有关信号量之后,我尝试了这个测试代码,我在其中创建了两个线程A和B.我的目标是,让线程A等待线程B中某些操作的10秒完成。但是由于我稍微改变了线程B中的逻辑,通过引入一个永远不会出现的无限循环,线程A也挂起,并且程序永远运行。任何人都可以帮助我实现我期待的目标吗?信号量和线程问题

包装;

import java.util.concurrent.Semaphore; 

public class Concurrency { 
    public int count = 0; 

    public static void main(String args[]) throws Exception { 
    final Semaphore sem = new Semaphore(1, true); 
    Thread thrdA, thrdB; 
    thrdA = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      synchronized (sem) { 
       try { 
        sem.wait(10000); 
        System.out.println("thread1"); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 

     } 
    }); 
    thrdB = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      synchronized (sem) { 
       System.out.println("thread2"); 

       while(true){ 

       } 
      } 

     } 
    }); 

    thrdA.start(); 
    thrdB.start(); 

    thrdA.join(); 
    thrdB.join(); 

    } 
} 
+4

为什么你在使用'Semaphore'如果你从来没有'acquire()'然后'release()'它呢?你可以为此使用一个'private final Object'。 – corsiKa 2011-12-22 06:08:56

回答

0

Glowcoder是正确的 - 这将永远运行,因为你的线程没有做任何有用的事情。 thrdA正在等待信号量,thrdB永远循环无用 - 它应该在某个时刻对信号量做些什么,以便thrdA能够超越等待。

2

你的代码有很多问题。

  1. 正如评论和答案中所述,如果您想等待/通知您不必使用Semaphore
  2. while(true)给CPU带来沉重的负担。考虑使用Thread.sleep,或者获取一个信号/锁。
  3. 您需要详细说明您想要达到的目标。如果你想让threadB等待threadA,你不需要任何信号/锁。在拨打thread2.run之前拨打电话thread1.join()
+0

1.yeah我同意虽然(真)是很多的CPU负载,但这只是一个实验代码,我写了,看看会发生什么,如果第二个线程挂起,并且第一个线程等待第二个超时10秒。 2.另外,由于某些限制,我无法在我的代码中使用Thread.sleep。 – 2011-12-22 07:03:52