在我校的多线程问题和练习的程序解决方案中,实现Runnable
接口的类通常被赋予Thread
字段,在以下示例中自动实例化:
protected Thread thr = new Thread(this);
此字段随后用作控制类本身实例化的线程的方法。例如:
public void stop() {
if (thr != null) thr.interrupt();
}
然后用于中断使用Thread
类创建的Runnable
个对象。
直接从上述解决方案移植的完整类示例如下:
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
的线程?
答案 0 :(得分:3)
这是如何运作的?
Thread
构造函数采用Runnable
,Thread
实现此接口。 this
指的是Thread
个实例。因此,语句Thread thr = new Thread(this)
有效,但应避免这种做法。
是否有更简单/更有效的替代方法来控制Runnable的线程?
Thread thread = new Thread(new AktFiguraImpl());
thread.start();
您可以通过专门为此目的设计的类来控制线程。
class ThreadController {
public ThreadController(Thread thread, AktFigura figura) { ... }
// methods to manipulate the thread
}