Вы можете переопределить start
, как и любой другой метод
Thread myThread = new Thread() {
@Override
public void start() {
// do something in the actual (old) thread
super.start();
}
@Override
public void run() {
// do something in a new thread if 'called' by super.start()
}
};
но вы должны вызвать super.start()
, чтобы создать новый поток, и run()
вызвать в этом новом потоке. Оригинальный start
обладает магией (нативный код), которую вы вряд ли сможете имитировать.
Если вы вызываете run()
непосредственно из вашего start()
(или любого другого метода), он выполняется в реальном потоке как обычный метод, а не в новом потоке. Нет смысла использовать поток, если вы не хотите запускать какой-либо код в новом потоке.
Вы должны поместить свою логику принятия решения в метод run()
, возможно, используя некоторую переменную, заданную в конструкторе (или другой метод, в конечном итоге в start
), если это действительно необходимо. Я не могу найти причину необходимости этой переменной, этого должно быть достаточно, чтобы проверить условие в run()
, как уже предлагалось в другом месте.
class MyThread extends Thread {
private final boolean flag;
public MyThread(boolean someCondition) {
flag = someCondition;
}
// alternative
// @Override
// public synchronized void start() {
// flag = <<someCondition>>
// super.start();
// }
@Override
public void run() {
if (flag) {
// do something like super.run()
} else {
// do something else
}
}
}
но было бы легче понять и поддерживать, если бы вы делали это так, как предложил @Henning!
Это также более объектно-ориентированное решение ...