Я считаю, что мой случай был «особенным», чтобы использовать Thread.stop
, так что вот мое решение для людей, которые считают, что их случай тоже достаточно особенный. (Я бы очень старался, используя это где-то, что на самом деле могло бы иметь значение.)
Как отмечают в основном все, нет чистого способа остановить задачу без проверки этой задачи, должна ли она остановиться сама. Я создал класс, который реализует Runnable
для выполнения таким образом, что он не будет драматичным, если его убьют. Поле результата (milliseconds
) - AtomicLong
, поскольку запись в обычные long
переменные не гарантируется как атомарная.
class SolveTimer implements Runnable
{
private String buildData;
private AtomicLong milliseconds = new AtomicLong(-1);
public SolveTimer(String buildData)
{
assert buildData != null;
this.buildData = buildData;
}
public void run()
{
long time = System.currentTimeMillis();
// create the grid, solve the grid
milliseconds.set(System.currentTimeMillis() - time);
}
public long getDuration() throws ContradictionException
{
return milliseconds.get();
}
}
Мой код создает поток на каждой итерации и запускает SolveTimer
. Затем он пытается присоединиться в течение 10 секунд. После возврата join
основной поток вызывает getDuration
в таймере выполнения; если он возвращает -1, то задача занимает слишком много времени и поток уничтожается.
SolveTimer timer = new SolveTimer(buildData);
Thread worker = new Thread(timer);
worker.start();
worker.join(10000);
long result = timer.getDuration();
if (result == -1)
{
System.err.println("Unable to solve");
worker.stop();
}
Следует отметить, что это затрудняет отладку рабочих потоков: когда поток приостанавливается отладчиком, он все еще может быть уничтожен Thread.stop()
. На моей машине это пишет короткое сообщение об ошибке ThreadDeath
в консоли и приводит к сбою процесса Java.
Существует возможное состояние гонки, при котором рабочий поток завершает точно (или сразу после) getDuration
, и из-за этого result
будет -1
, даже если задача действительно выполнена успешно , Тем не менее, это то, с чем я могу жить: 10 секунд - это уже слишком долго, так что в этот момент мне уже все равно, достаточно ли это почти .