在作业中停止ScheduledExecutorService中的Runnable作业

时间:2017-11-29 08:25:39

标签: java multithreading scheduledexecutorservice

注意:这是玩具代码而非生产就绪。

我想安排MyTask运行每个固定延迟(例如2秒)。完成此任务后,他们希望自己停止。 MyTask的代码是:

public class MyTask implements Runnable {
    MainClass parent;
    AtomicInteger integer = new AtomicInteger(0);
    public MyTask(MainClass parent) {
        this.parent = parent;
    }

    @Override
    public void run() {
        try {
            int valueNow = integer.incrementAndGet();
            System.out.println("Running with value: " + valueNow + " and going to do work");
            Thread.sleep((long)(Math.random() * 10000)); // simulate some work
            System.out.println("Running with value: " + valueNow + " and work over");
            if(valueNow == 5) {
                parent.stopTask();
            }
        } catch (Exception exception) {
            System.out.println("Interrupted");
        }
    }
}

MainClass是安排它的那个:

public class MainClass {
    private ScheduledExecutorService executorService;
    private ScheduledFuture updateFuture;
    public static void main(String[] args) {
        new MainClass().startMyTask();
    }
    public void startMyTask() {
        System.out.println("Starting MyTask to run every 2 seconds..............");
        executorService = Executors.newScheduledThreadPool(2);
        updateFuture = executorService.scheduleAtFixedRate(new MyTask(this), 1, 2, TimeUnit.SECONDS);
    }
    public void stopTask() {
       System.out.println("Stopping MyTask to run further");
       updateFuture.cancel(true);
    }
}

这只是一个重现场景的玩具代码。 这种方法有什么问题吗我将对父级的引用传递给线程,以便可以停止它? 有没有更好的方法呢?

0 个答案:

没有答案