К первому вопросу: запуск потока в конструкторе с передачей this
экранирует this
. Это означает, что вы фактически даете ссылку на свой объект до того, как он будет полностью создан. Поток начнется до того, как ваш конструктор завершит работу. Это может привести ко всем видам странного поведения.
К вашему второму вопросу: нет приемлемого способа принудительно остановить другой поток в Java, поэтому вы должны использовать переменную, которую поток будет проверять, чтобы узнать, должен ли он остановиться. Другой поток установил бы это, чтобы указать, что первый поток остановится. Переменная должна быть изменчивой или все обращения должны быть синхронизированы, чтобы обеспечить правильную публикацию. Вот код, который будет примерно таким, как вы хотите.
public class MyNewThread implements Runnable {
private final Thread t;
private volatile boolean shouldStop = false;
MyNewThread() {
t = new Thread (this, "Data Thread");
}
public void start() {
t.start();
}
public void stop() {
shouldStop = true;
}
public void run() {
while(!shouldStop)
{
// do stuff
}
}
}
Все, что хочет создать и запустить поток, будет делать:
MyNewThread thread = new MyNewThread();
thread.start();
Все, что захочет остановить поток, будет делать:
thread.stop();