Поле потока внутри класса, реализующее Runnable, которое создает указанный класс - PullRequest
0 голосов
/ 09 июня 2018

В программных решениях моей школы для задач и упражнений с многопоточностью классы, реализующие интерфейс 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?

1 Ответ

0 голосов
/ 09 июня 2018

Как это работает?

Конструктор 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...