Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等待不是';t超时_Java_Multithreading_Concurrency_Wait_Notify - Fatal编程技术网

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;ifor
wait()
状态

此方法导致当前线程(称为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();