java上的进程通信和对象方法wait()
//Two threads, one print a-z, and one print A-Z
public class ThreadPrint {
public static void main(String[] args) throws Exception {
Object obj=new Object();
Thread1 t1=new Thread1(obj);
Thread2 t2=new Thread2(obj);
t1.start();
t2.start();
}
//The first thread
class Thread1 extends Thread
{
private Object obj;
public Thread1(Object obj)
{
this.obj=obj;
}
public void run()
{
//Synchronize code blocks
synchronized(obj)
{
for(int i=0;i<26;i++)
{
//print
System.out.println((char)('a'+i)+" ");
//Wake-up process
obj.notifyAll();
try
{
if(i!=25)
{
obj.wait();
}
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
class Thread2 extends Thread
{
private Object obj;
public Thread2(Object obj)
{
this.obj=obj;
}
public void run()
{
//synchronized code blocks
synchronized(obj)
{
for(int i=0;i<26;i++)
{
System.out.println((char)('A'+i)+" ");
//Wake up to a previous process
obj.notifyAll();
try
{
if(i!=25)
{
obj.wait();
}
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
}
Console:Exception in thread "main" java.lang.Error: Unresolved compilation problem:
No enclosing instance of type ThreadPrint is accessible. Must qualify the allocation with an enclosing instance of type ThreadPrint (e.g. x.new A() where x is an instance of ThreadPrint).
我知道这意味着进程不同步。我的第一个想法是在同步(obj)之前等待(obj)
Unhandled exception type InterruptedException
如你所见,我无法解决它。
如何在代码中解决它?
为什么不呢。是否在同步之前等待()(obj)
试验条件:
JDK1。8ide:Eclipse
# 1 楼答案
编译问题是在代码编译期间而不是在应用程序运行期间发生的问题。如果您遇到编译问题,它只意味着代码中的某些语法与编程语言的正确语法不匹配
在代码类中
Thread1
和Thread2
是内部类(在类ThreadPrint
的花括号内声明为非静态类)。要实例化非静态内部类的对象,需要外部封闭类的对象。您试图创建Thread1
和Thread2
的对象,但没有创建和使用ThreadPrint
的对象。这导致了你提到的最初问题还要注意的是内调用它们。所以你想在
wait
、notify
和notifyall
方法应该只由对象监视器的所有者(调用这些方法的对象)的线程调用,也就是说,只能从^{synchronized block
之前等待的想法是行不通的。还要注意wait
方法必须从循环中调用。当我们希望一个任务完成时,应该调用方法wait
,当其他线程通知当前线程时,当前线程将收到该任务的通知。在收到通知后,必须在循环中验证任务完成状态,以防止当前线程因任何其他通知或某些中断而唤醒并继续。(参考:https://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html)你有三个选择:
只需创建外部封闭类
ThreadPrint
的对象,然后使用该对象创建Thread1
和Thread2
的对象将类
Thread1
和Thread2
定义为static
在各自独立的java文件中声明类
Thread1
和Thread2