我有一个名为“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();
}
}
下面是错误:错误截图
2条答案
按热度按时间jhiyze9q1#
如果对某个对象进行了同步,则只能对该对象调用等待。
比如说:
f0ofjuux2#
你可能有点搞砸了,notify()和wait()需要拥有时钟对象的监视器。您可以尝试获得正确的wait/notify语义,但我建议只使用内置工具,特别是synchronizedqueue。时钟可以只把一个作为一个字段,并在确定时将1放入其中。另一个线程可以放入一个不忙的wait(),并从队列中取一个简单的take(),它将阻塞,直到clock类放入某个内容。