Попробуйте interrupt (), как говорили некоторые, чтобы увидеть, имеет ли это какое-то значение для вашего потока. Если нет, попробуйте уничтожить или закрыть ресурс, который остановит поток. Это имеет шанс быть немного лучше, чем пытаться бросить в него Thread.stop ().
Если производительность приемлема, вы можете рассматривать каждое 3D-обновление как отдельное непрерывное событие и просто доводить его до конца, а затем проверять наличие нового обновления. Это может сделать GUI немного нестабильным для пользователей, так как они смогут внести пять изменений, затем увидеть графические результаты того, как вещи были пять изменений назад, а затем увидеть результат их последнего изменения. Но в зависимости от того, как долго этот процесс, он может быть терпимым, и это позволит избежать необходимости уничтожать поток. Дизайн может выглядеть так:
boolean stopFlag = false;
Object[] latestArgs = null;
public void run() {
while (!stopFlag) {
if (latestArgs != null) {
Object[] args = latestArgs;
latestArgs = null;
perform3dUpdate(args);
} else {
Thread.sleep(500);
}
}
}
public void endThread() {
stopFlag = true;
}
public void updateSettings(Object[] args) {
latestArgs = args;
}