有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    编译问题是在代码编译期间而不是在应用程序运行期间发生的问题。如果您遇到编译问题,它只意味着代码中的某些语法与编程语言的正确语法不匹配

    在代码类中Thread1Thread2是内部类(在类ThreadPrint的花括号内声明为非静态类)。要实例化非静态内部类的对象,需要外部封闭类的对象。您试图创建Thread1Thread2的对象,但没有创建和使用ThreadPrint的对象。这导致了你提到的最初问题

    还要注意的是waitnotifynotifyall方法应该只由对象监视器的所有者(调用这些方法的对象)的线程调用,也就是说,只能从^{内调用它们。所以你想在synchronized block之前等待的想法是行不通的。还要注意wait方法必须从循环中调用。当我们希望一个任务完成时,应该调用方法wait,当其他线程通知当前线程时,当前线程将收到该任务的通知。在收到通知后,必须在循环中验证任务完成状态,以防止当前线程因任何其他通知或某些中断而唤醒并继续。(参考:https://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html

    你有三个选择:

    1. 只需创建外部封闭类ThreadPrint的对象,然后使用该对象创建Thread1Thread2的对象

    2. 将类Thread1Thread2定义为static

    3. 在各自独立的java文件中声明类Thread1Thread2