2011-11-16 53 views
-2

我真的不喜欢在旅途中发布多个问题,抱歉,如果这是烦人的。同步是如何工作的?

我终于设法解决了我的问题。除了我不确定它是可靠的还是明智的。

public void run() { 
      // TODO Auto-generated method stub 


      float time = 0.01f; 
      try { 
       while(time < timer) 
       { 
         time+=0.1f; 
             Thread.sleep(100); 
       } 

      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 

     synchronized (ProgressBar.class) { 
      int val =++ProgressBar.threadCount; 
      if(val == 10) 
      { 
           System.out.println("All threads are finished!") ; 
      } 
     } 

    } 
} 

我已经测试了5分钟,现在看来工作。 但有人可以解释发生了什么?当线程启动时,它确保同步块未被使用,否则等待它完成。 那它是一些排队系统吗? 再次感谢。 编辑:

以前的链接 How does AtomicInteger work?

Thread.join freezes progressbar

+0

怎么了downvotes?这不是一个有效的问题吗? –

+0

我还没有投票,但我有我的问题与这个问题。你提到一个早期的问题,但不要链接到它(你期望我去搜索它吗?)。你没有解释代码应该做什么。您的代码示例不会显示您的线程是如何创建的,也不会显示您的案例中的ProgressBar。 – ibid

+2

阅读 - http://download.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – adatapost

回答

1

一个​​块使用的对象的锁,它指的是,你的情况ProgressBar.class。如果没有其他线程拥有该锁,则​​块会获取并继续。如果锁已经被另一个线程所拥有,则​​块会进入休眠状态,等待锁释放,然后再次尝试。一旦拥有该锁的线程完成​​块,它将释放该锁,这会导致至少有一个等待该锁的线程尝试获取该锁。

(这种解释忽视了同一个线程可以释放它之前获得锁几次。只要线程拥有该锁至少一次,其他所有线程都从获取它阻塞的可能性。)

the Java Language Specification

+0

是的,我想这就是我想知道的。 我有一个锁定,阻止另一个线程递增计数器。强制其他线程在可以使用该代码块之前等待。只要它不是无限期的那么我猜就没事了。谢谢 –

+0

感谢您的链接 –