我真的不喜欢一次发布多个问题,对不起,如果这很烦人。
我终于设法解决了我的问题。除非我不确定它是否可靠甚至是明智的。
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分钟,它似乎有效。 但有人可以解释发生了什么吗?线程启动时,它确保同步块未被使用,否则等待它完成。 那是一些排队系统吗? 再次感谢。 编辑:
答案 0 :(得分:1)
synchronized
块在您的案例ProgressBar.class
中使用其引用的对象中的锁。如果没有其他线程拥有该锁,则synchronized
块获取它并继续。如果锁已经被另一个线程拥有,则synchronized
块进入休眠状态以等待锁的释放,此时它再次尝试。一旦拥有锁的线程以synchronized
块结束,它就会释放锁,这会导致至少有一个等待锁的线程尝试获取它。
(这个解释忽略了同一个线程在释放之前可能多次获取锁的可能性。只要线程拥有锁至少一次,所有其他线程就被阻止获取它。)