В программных решениях моей школы для задач и упражнений с многопоточностью классы, реализующие интерфейс Runnable
, обычно получают поле Thread
, которое автоматически создается в следующем примере:
protected Thread thr = new Thread(this);
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
?