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)是否获得该对象上的锁?@user330223Synchronized
关键字标记一个只能由单个线程同时输入的块。如果另一个线程当前位于同一对象上的同步块中,则执行将暂停,直到另一个线程离开其同步块。您可以详细解释如何释放和获取对象上的锁吗?@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();} } } }