Java 等待不是';t超时
我制作此示例是为了测试等待/通知功能:Java 等待不是';t超时,java,multithreading,concurrency,wait,notify,Java,Multithreading,Concurrency,Wait,Notify,我制作此示例是为了测试等待/通知功能: public class WaitingTest implements Runnable { Thread b = new Thread(this,"query"); int total=0; public static void main(String[] args){ WaitingTest w = new WaitingTest(); } public WaitingTest(){
public class WaitingTest implements Runnable {
Thread b = new Thread(this,"query");
int total=0;
public static void main(String[] args){
WaitingTest w = new WaitingTest();
}
public WaitingTest(){
b.start();
synchronized(b){
try{
System.out.println("Waiting for b to complete...");
b.wait(10);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("Total is: " + total);
}
}
@Override
public void run(){
synchronized(b){
for(int i=0; i<1000000000 ; i++){
total += i;
}
}
}
}
public类WaitingTest实现可运行{
线程b=新线程(此“查询”);
int-total=0;
公共静态void main(字符串[]args){
WaitingTest w=新的WaitingTest();
}
公共等待测试(){
b、 start();
已同步(b){
试一试{
System.out.println(“等待b完成…”);
b、 等待(10);
}捕捉(中断异常e){
e、 printStackTrace();
}
System.out.println(“总计为:“+Total”);
}
}
@凌驾
公开募捐{
已同步(b){
for(int i=0;iforwait()
状态
此方法导致当前线程(称为T)将自身置于
为该对象设置的等待,然后放弃任何和所有
此对象上的同步声明
所以当你这么做的时候
b.wait(10);
当前线程释放它在b
上的synchronized
,因此您的另一个线程可以通过来自的run()
方法获取它
b.start();
total
开始增加。10ms后,主线程重新获得b
上的锁(假设run()
完成),并打印出总数。请注意,您的total
很可能会溢出。您会得到溢出(您不能将这100000000个非负整数相加,并将结果存储在整数中)。将总计定义为long。在run方法中的循环完成后,也可以调用b.notify()或b.notifyAll()
。
另外,将wait(10)更改为just wait(),这将使打印线程等待
计算线程需要多少(而不仅仅是10毫秒)。
这是进行此测试的正确方法。
关于线程同步部分,我建议您阅读一些内容,例如这些旧文章
不需要在标题中添加主标记。@VictorLiveira在您的编辑中-尽管您现在在循环之前调用了b.notify(),但您仍然无法得到零(在打印线程中),因为您尚未离开同步块(在计算线程中)。我不确定是否得到了您,但这意味着我的“b”线程正在等待通知,在通知之前,它将不执行任何操作,超时运行后将再次开始执行,并且在所有操作完成后,它将打印总值?(我知道溢出,但这只是在实际项目中应用该思想的示例)@victor这一切都取决于线程调度程序,但让我们举个例子。调用构造函数后,您将使用b.start()
启动第二个线程。如果该线程首先获取b
监视器,则您的运行()
将完成,因为主线程无法获取b
。如果主线程首先获取b
监视器,它将打印消息,调用等待(10)
,放弃对b
监视器的控制,并被放入b
监视器的等待区。您的另一个线程将再次完成,此时b
监视器可用于拍摄。@Sotirios Delimanolis他只是得到一个溢出,这是他的主要问题,而不是线程同步部分。@peter.petrov OP声明所以,我的输出应该是零,
。我想他们只是不明白为什么另一个线程正在执行。@SotiriosDelimanolis好的,这也是真的。同意。但我确定他缺少溢出部分:)我错过了5分钟。他惊讶地看到那里有一个负数(这是由于溢出).所以我认为这是奥普的主要问题。
b.start();