ScheduledExecutorService перестает выполняться после вызова shutdownNow

#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. Вы не можете прослушивать прерывания потока. А проверка на наличие прерываний время от времени будет оказывать незначительное влияние на производительность.