Прерывание потока, который ожидает на блокирующем действии?

%1 относится к первому аргументу, передал в и не может использоваться в итераторе.

Попытка это:

@echo off
for %%i in (*.*) do echo %%i
5
задан Arnold Schrijver 17 August 2017 в 22:11
поделиться

5 ответов

Во-первых, вам действительно не нужен отдельный флаг (если вы это сделаете, используйте AtomicBoolean ), просто проверьте Thread.currentThread (). isInterrupted () в качестве условия while.

Во-вторых, ваш метод остановки победил ' t работает, потому что он не прерывает правильный поток. Если другой поток вызывает остановку, код использует Thread.currentThread () , что означает, что вызывающий поток будет прерван, а не запущенный.

Наконец, какой метод блокировки? Это scheduleSource () ? Если этот метод не генерирует InterruptedException , вы не сможете его поймать.

Попробуйте следующее:

private final AtomicReference<Thread> currentThread = new AtomicReference<Thread>();

public void run() {
    Proxy proxy = ProxyFactory.generateProxy();
    Source source;

    currentThread.set(Thread.currentThread());

    while (!Thread.currentThread().isInterrupted()) {
        try {
            source = proxy.getPendingSources();
            scheduleSource(source);
        } catch (Exception e) {
            log.error("UnExpected Exception caught while running", e);
        }
    }
}

public void stop() {
    currentThread.get().interrupt();
}
12
ответ дан 18 December 2019 в 05:55
поделиться

Вы остановите Метод вызывает прерывание в неправильном потоке. Thread.currentThread () - это поток, который прерывается, а не прерывается.

2
ответ дан 18 December 2019 в 05:55
поделиться

Как вы вызываете остановку из выполняющегося потока ?
Если вы вызовете stop () из другого потока, вы убьете его, а не поток, работающий в блоке try / catch.

1
ответ дан 18 December 2019 в 05:55
поделиться

хорошо, люди, не убивайте меня из-за этого.

Я экспериментировал с Thread.stop () ради развлечения, чтобы исключить поток из блокирующего действия, поймать ThreadDeath, сохранить целевой поток в живых и двигаться дальше.

Кажется, он работает. Миру не конец. Но я просто говорю. Вы несете ответственность за свои действия. Почему я читаю рэп?

2
ответ дан 18 December 2019 в 05:55
поделиться

Прервать можно лишь несколько четко определенных «методов блокировки». Если поток прерывается, устанавливается флаг, но больше ничего не произойдет, пока поток не достигнет одной из этих четко определенных точек прерывания.

Например, read () и write ( ) Вызовы являются прерываемыми, если они вызываются в потоках, созданных с помощью InterruptibleChannel . Если Socket используется в качестве отправной точки, вызов interrupt () для Thread , заблокированного при чтении, не имеет никакого эффекта. Обратите внимание, что если операция блокирующего ввода-вывода успешно прерывается, соответствующий канал закрывается.

Другой большой класс прерываемых операций - это операции, инициированные различными блокирующими операциями в классах в java.util.concurrent пакеты. Конечно, исходный метод wait () также является прерываемым.

Методы блокировки можно идентифицировать, ища выдает InterruptedException в их сигнатурах методов. Они также должны быть хорошо задокументированы, чтобы описывать любые побочные эффекты прерывания.

Вы можете написать собственный прерываемый метод, но он сам должен состоять из прерываемых операций нижнего уровня.

11
ответ дан 18 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: