Java 控件在通知后不返回等待线程

Java 控件在通知后不返回等待线程,java,multithreading,wait,Java,Multithreading,Wait,我创建了一个名为ThreadA的新线程,并在主线程中启动它 我等待在ThreadA中完成一些操作 在一些操作之后,我使用notify发送了通知 但是主线程中wait下面的代码不会被调用,它会等待ThreadA的整个代码完成 这是线程的本质还是仅仅是线程获取运行权限的问题 Job job = new MyJob(); job.schedule(); synchronized(job) { job.wait(); sysout("After notify"); } 这里的j

我创建了一个名为
ThreadA
的新线程,并在主线程中启动它

我等待在
ThreadA
中完成一些操作

在一些操作之后,我使用
notify
发送了通知

但是主线程中
wait
下面的代码不会被调用,它会等待
ThreadA
的整个代码完成

这是线程的本质还是仅仅是线程获取运行权限的问题

Job job = new MyJob(); 
job.schedule(); 
synchronized(job) {
    job.wait(); 
    sysout("After notify");
} 
这里的
job
是org.eclipse.core.runtime.jobs

内部作业运行方法:

run {
    synchronized(this) {
        step 1(); 
        notify(); 
        step 2();
    }
} 

这里第2步是大代码

通知线程在释放锁之前不会实际发送通知。您需要在通知发生之前释放锁,而您的代码没有这样做

当然,接收通知的线程没有锁。它必须先获取锁,然后才能执行操作,如果线程正在等待,则需要先获取锁,然后才能退出wait方法。对于通知线程没有偏好,也没有理由认为它必须是下一步行动的第一个线程

这就是为什么建议始终在循环中调用wait的部分原因,而您并没有这样做。唤醒线程在获得锁后应检查其被唤醒的条件是否仍然为真


从调用step1到调用step2,作业运行方法始终保持锁。对于通知线程来说,它必须停止等待,这需要在退出wait方法之前重新获取锁(因为它必须进入自己的同步块)。这意味着在通知线程释放锁之前发送通知是没有意义的,因为等待的线程对此无能为力。

请显示您的代码(您调用
wait
notify
的确切方式)。Job Job=new MyJob();job.schedule();synchronized(job){job.wait();sysout(“After notify”)}这里的job是org.eclipse.core.runtime.jobs.Inside作业运行方法:运行{synchronized(this){step 1();notify();step 2();}}这里的第2步是一段大代码。我的代码首先进入第2步,只有在完成步骤2后在主线程中调用sysout,我才建议替换
wait()
notify()
使用更现代的工具类,如提供的?Synchronized(job)是否获得该对象上的锁?@user330223
Synchronized
关键字标记一个只能由单个线程同时输入的块。如果另一个线程当前位于同一对象上的同步块中,则执行将暂停,直到另一个线程离开其同步块。您可以详细解释如何释放和获取对象上的锁吗?@user330223请通读。希望您能了解到,一旦同步块离开(将其视为执行指针通过
}
符号时)或同步块内发生异常(该异常未由同步块public类ThreadMain{public static void main内的try catch块处理),锁就会被释放(String[]args){System.out.println(“In main”);ThreadMain=new ThreadMain();ThreadA runnable=new ThreadA(main);Thread Thread=new Thread(runnable);Thread.start();synchronized(runnable){try{runnable.wait();System.out.println(“Thread notified”);}catch(interruptedeexception exp){.printStackTrace();} } } }