2013-06-01 1 views
1

Непосредственно из this оракула урока:о прерываниях в Java

прерываний

Прерывания является указанием на волосок, что он должен прекратить то, что он делает и делать что-то другое. Программист должен решить точно, как поток отвечает на прерывание, но очень часто бывает для завершения потока. Это использование подчеркивается в этом уроке .

«Это до программиста, чтобы решить ..» Где можно запрограммировать, что определенное поведение? Есть ли «Это очень общий для потока, чтобы прекратить» означает, что стандартное поведение прекращается поток ?

EDIT: Например, мы имеем метод acquireUninterruptibly от Sempaphore класса, который, если получает прерывание он просто задерживает время ожидания количества времени, что прерывание, вызванное быть прервано. Вероятно, в этом случае обработка прерываний состоит только из Thread.yield()? Спасибо заранее.

ответ

2

Обычно метод, подобный спящим броскам InterruptedException.

Если поток длится много времени, не вызывая метод, который вызывает InterruptedException? Затем он должен периодически вызывать Thread.interrupted, который возвращает true, если получено прерывание. Например:

for (int i = 0; i < inputs.length; i++) { 
    heavyCrunch(inputs[i]); 
    if (Thread.interrupted()) { 
     // We've been interrupted: no more crunching. 
     return; 
    } 
} 

В этом простом примере код просто проверяет прерывание и выходит из потока, если он был получен. В более сложных приложениях, он может иметь больше смысла бросать InterruptedException:

if (Thread.interrupted()) { 
    throw new InterruptedException(); 
} 

Сейчас отвечать на ваши вопросы:

  1. из приведенного выше примера вы можете увидеть, что вы можете справиться с InterruptedException по вашим собственный, если он не обрабатывается методом
  2. Как вы можете справиться с этим для этих методов, вы можете выполнять другие задачи, а не выходить. Но, безусловно, наиболее распространенным является выход потока после прерывания.

Источник: javadoc

+0

Tnx для ответа, проверьте мой вопрос обновление. Согласны ли вы, что это просто вызов Thread.yield()? – Rollerball

+0

Я думаю, вы можете использовать выход, когда прерывание называется – stinepike

1

Прерывание происходит, когда есть проблема (даже существует какой-то другой случай), а программа 'll переключается на INTERRUPT SERVICE ROUTINE. Он может справиться с этой проблемой и продолжить выполнение или прекратить работу, если он не может быть разрешен.

В java, даже «Исключение» (прерывание), мы обычно пишем такие процедуры (которые могут вызвать прерывание) и catch (исключение), где мы его поймаем и обрабатываем. если проблема не может быть решена, мы ее прекратим.

0

При установке прерывания он устанавливает флаг, это гораздо сложнее, чем это, но это основное поведение.Вы программируете точки для обнаружения прерывания с помощью

if(Thread.currentThread.isInterrupted()) 

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

Смежные вопросы