#java #multithreading #executorservice #scheduledexecutorservice
#java #многопоточность #executorservice #scheduledexecutorservice
Вопрос:
Мне нужна помощь, чтобы остановить мой текущий выполняемый поток при завершении работы ScheduledExecutorService. В приведенном ниже коде я хотел бы остановить потоковое задание при завершении родительского исполнителя.
несмотря на то, что я использую shutdownNow(), он не останавливает текущий запущенный поток и его цикл потока. Я могу завершить работу, если у меня есть Thread.sleep() в DoSomeHardJob.adding() с использованием InterruptedException.
scheduledFuture.cancel(true);
Я пробовал выше, но не работает. Есть ли какой-либо другой вариант, могу ли я попытаться завершить текущее задание. Любая помощь / идея действительно сокращены.
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
public class ThreadWork {
public static void main(String[] args) throws InterruptedException {
ScheduledExecutorService schExService = Executors.newScheduledThreadPool(0);
int repeatMin = 2;
ScheduledFuture<?> scheduledFuture = schExService.scheduleWithFixedDelay(new RunConfiguraiton(), 0, repeatMin, TimeUnit.SECONDS);
Thread.sleep(3*1000);
scheduledFuture.cancel(true);
schExService.shutdownNow();
Thread.sleep(1*1000);
System.out.println("I am good there for fresh start");
}
}
class RunConfiguraiton implements Runnable
{
@Override
public void run() {
List<Integer> intList = Arrays.asList(10,5,60,45,100,50,232);
try {
intList.stream().map(i -> {
try {
return DoSomeHardJob.adding(i);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return 0;
}
}).collect(Collectors.toList());
} catch (Exception e) {
System.out.println("final exit");
e.printStackTrace();
}
}
static class DoSomeHardJob{
public static int adding(int i) throws Exception {
try {
int result = 0;
for (int j = 0; j < 999999999; j ) {
System.out.print(j);
result = result j;
}
return resu<
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
}
Комментарии:
1. лучше всего проверять Thread.currentThread().isInterrupted() не на каждой итерации цикла, а, скажем, после выполнения части работы.
2. Я не уверен, насколько эффективно часто проверять Thread.currentThread().isInterrupted() ,. в классе DoSomeHardJob. более или менее я ожидал, что какой-либо список событий перехватит прерывание потока. @prembhaskal спасибо за предложение
3. Вы не можете прослушивать прерывания потока. А проверка на наличие прерываний время от времени будет оказывать незначительное влияние на производительность.