【发布时间】:2018-06-09 16:34:38
【问题描述】:
在我学校的多线程问题和练习的程序解决方案中,实现Runnable接口的类通常会被赋予一个Thread字段,在下面的例子中是自动实例化的:
protected Thread thr = new Thread(this);
该字段随后被用作控制类本身实例化的线程的一种手段。例如:
public void stop() {
if (thr != null) thr.interrupt();
}
然后用于中断使用Runnable 类创建的Thread 对象。
下面给出了直接从上述解决方案移植的完整类示例:
package hokej;
import java.awt.Color;
public abstract class AktFigura extends Figura implements Runnable {
protected Thread nit = new Thread(this);
private int tAzur;
private boolean radi;
public AktFigura(Scena s, int xx, int yy,
Color b, int t) {
super(s, xx, yy, b); tAzur = t;
}
protected abstract void azurirajPolozaj();
public void run() {
try {
while (!Thread.interrupted()) {
synchronized (this) {
if (!radi) wait();
}
azurirajPolozaj();
scena.repaint();
Thread.sleep(tAzur);
}
} catch (InterruptedException ie) {}
}
public synchronized void kreni() {
radi = true; notify();
}
public void stani() { radi = false; }
public void prekini() {
if (nit != null) nit.interrupt();
}
}
我的问题是:这是如何工作的?Thread 字段不应该是与在程序的其他部分调用 new Thread(class); 生成的对象分开的对象吗(因此关键字的名称 - new)?
或者这只是 Java 解释器以某种方式识别的一种特殊情况?
另一个问题是这种设计作为控制方法的可行性。有没有更简单/更有效的方法来控制Runnable 的线程?
【问题讨论】:
-
我们需要更多代码来更好地分析您的程序。
-
如果这是当时
start()ed 的线程,那么这并不是一个好的设计。如果不是启动的Thread,那么实例方法调用就没有多大意义了。 -
docs.oracle.com/javase/7/docs/api/java/lang/… Thread 接受你的 runnable,不管它放在哪里
-
@LuiggiMendoza 我在这里添加了一个类示例。其余的可以在这个网站上找到rti.etf.bg.ac.rs/rti/ir2oo2/rokovi/OO2I170607.pdf
标签: java multithreading runnable