实现 Runnable 的 class 中的线程字段,实例化所述 class
Thread field inside a class that implements Runnable, which instantiates said class
在我校的多线程题和习题的程序解中,实现了Runnable
接口的classes通常会给出一个Thread
字段,在下面的例子中会自动实例化:
protected Thread thr = new Thread(this);
此字段随后用作控制实例化 class 本身的线程的方法。例如:
public void stop() {
if (thr != null) thr.interrupt();
}
然后用于中断 Thread
使用 Runnable
class 创建的对象。
下面给出了一个完整的 class 示例,直接从上述解决方案移植而来:
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 解释器以某种方式识别的一种特殊情况?
另一个问题是这种设计作为控制方法的可行性。是否有任何 simpler/more 有效的替代方法来控制 Runnable
的线程?
How does this work?
Thread
构造函数接受一个Runnable
,Thread
实现了这个接口。 this
指的是 Thread
实例。所以,声明 Thread thr = new Thread(this)
是有效的,但是应该避免这种做法。
Is there any simpler/more efficient alternative for controlling a Runnable's thread?
Thread thread = new Thread(new AktFiguraImpl());
thread.start();
您可以通过专门为此目的设计的 class 来控制线程。
class ThreadController {
public ThreadController(Thread thread, AktFigura figura) { ... }
// methods to manipulate the thread
}
在我校的多线程题和习题的程序解中,实现了Runnable
接口的classes通常会给出一个Thread
字段,在下面的例子中会自动实例化:
protected Thread thr = new Thread(this);
此字段随后用作控制实例化 class 本身的线程的方法。例如:
public void stop() {
if (thr != null) thr.interrupt();
}
然后用于中断 Thread
使用 Runnable
class 创建的对象。
下面给出了一个完整的 class 示例,直接从上述解决方案移植而来:
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 解释器以某种方式识别的一种特殊情况?
另一个问题是这种设计作为控制方法的可行性。是否有任何 simpler/more 有效的替代方法来控制 Runnable
的线程?
How does this work?
Thread
构造函数接受一个Runnable
,Thread
实现了这个接口。 this
指的是 Thread
实例。所以,声明 Thread thr = new Thread(this)
是有效的,但是应该避免这种做法。
Is there any simpler/more efficient alternative for controlling a Runnable's thread?
Thread thread = new Thread(new AktFiguraImpl());
thread.start();
您可以通过专门为此目的设计的 class 来控制线程。
class ThreadController {
public ThreadController(Thread thread, AktFigura figura) { ... }
// methods to manipulate the thread
}