多线程—在java中,如何从不同线程中的其他类访问类的值?

lx0bsm1f  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(528)

我有一个名为“clock”的类,它有可运行的实现。在run()中,一个无限循环开始,线程每次迭代休眠100ms,然后更改一个布尔值:“isok”。
另一个类“conone”在它的独立线程中也有无限循环,它试图从“clock”类中获得“isok”布尔值。但如果值为false,则“conone”必须在线程处等待以继续。
所以我创建了conone对象,试图从“clock”类访问布尔值。但它引发了一个异常,描述“当前对象不是线程的所有者”。
为什么会这样?对不起我的英语。
这是代码:时钟类

public class Clock implements Runnable {
    boolean isOk;
    Thread t;

    Clock() {
        isOk = false;
        t = new Thread(this, "Clock_Thread");
    }

    void startClock() {
        t.start();
    }

    public void run() {
        int i = 0;
        while(true) {
            try {
                t.sleep(100);
                System.out.println("Tick:" + i);
                if(isOk) {
                    isOk = false;
                } else {
                    isOk = true;
                    notify();
                }
                i++;
            } catch(InterruptedException ie) {
                System.out.println("InterruptedException at Clock");
            }
        }
    }

    public boolean getPermit() {
        if (!isOk) {
            try {
                wait();
            } catch(InterruptedException e) {
                System.out.println("Exception at clock.getPermit()");
            }
        }
        return true;
    }
}

conone类:

public class ConOne implements Runnable {
    Thread t;
    Clock ct;

    ConOne(String name, Clock c) {
        t = new Thread(this, name);
        ct = c;
    }

    public void run() {
        while(true) {
            ct.getPermit();
            repaint();
        }
    }

    public void repaint() {
        System.out.println("Repainted On " + t);
    }
}

使用main方法初始化:

public class Master {
    public static void main(String[] args) {
        Clock clock = new Clock();
        ConOne con1 = new ConOne("Con11", clock);
        ConOne con2 = new ConOne("Con12", clock);

        clock.startClock();
        con1.t.start();
        con2.t.start();

    }
}

下面是错误:错误截图

jhiyze9q

jhiyze9q1#

如果对某个对象进行了同步,则只能对该对象调用等待。
比如说:

synchronized(monitor){
   while(!condition)
      monitor.wait();
}
f0ofjuux

f0ofjuux2#

你可能有点搞砸了,notify()和wait()需要拥有时钟对象的监视器。您可以尝试获得正确的wait/notify语义,但我建议只使用内置工具,特别是synchronizedqueue。时钟可以只把一个作为一个字段,并在确定时将1放入其中。另一个线程可以放入一个不忙的wait(),并从队列中取一个简单的take(),它将阻塞,直到clock类放入某个内容。

相关问题