【问题标题】:How to pause/restart SingleThreadExecutor (ExecutorService) in Java?如何在 Java 中暂停/重启 SingleThreadExecutor (ExecutorService)?
【发布时间】:2016-05-24 11:32:41
【问题描述】:

我已经实现了一个 Singleton 类“SingleTaskExecutor”,它使用 SingleThreadExecutor 按顺序一次执行一个任务。此类用于按时间顺序执行异步数据库操作。一切正常。但是现在我们有一个用例,我们需要暂停此服务一段时间,执行一些操作,然后恢复服务。不确定如何暂停/恢复服务。这是我的代码:

public class SingleTaskExecutor {

    private SingleTaskExecutor() {}
    private final ExecutorService executor =   Executors.newSingleThreadExecutor();

    private static class LazyHolder {
        private static final SingleTaskExecutor instance = new SingleTaskExecutor(); 
    }

    public static SingleTaskExecutor getInstance() {
        return LazyHolder.instance;
    }

    public <T> Task<T> create(Callable<T> callable) {
        Task<T> task = new Task<T>() {
            @Override
            protected T call() throws Exception {
                return callable.call();
            }
        };
        return task;
    }

    public <T> T execute(Task<T> task) {
        return (T) executor.submit(task);
    }

    public void shutDown() {
        executor.shutdown();
    }

    public void awaitTermination() {
        try {
            executor.awaitTermination(5, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void waitPlease() {
        try {
            Thread.currentThread().wait();
            //executor.wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void resume() {
        Thread.currentThread().notifyAll();
        //executor.notifyAll();
    }
}

【问题讨论】:

  • 您不能暂停已启动的单个任务。您还没有展示任务是如何提交和排队的,但您可能应该让该代码在暂停时停止提交任务。
  • 或者让您的任务检查布尔标志并在需要时等待。
  • Task task = SingleTaskExecutor.getInstance().create(() -> { createOrUpdate(posOrder); return null; }); SingleTaskExecutor.getInstance().execute(task);任务.get();

标签: java multithreading concurrency java.util.concurrent


【解决方案1】:

如果我的理解正确,您想暂停任务的执行,然后执行一些明确的任务,然后再继续执行。我实际上看到了以下解决方案:

private volatile boolean paused;

public <T> T execute(Task<T> task) {
    if(paused) {
        synchronized(this) {
            if(paused) {
                wait();
            }
        }
    }
    return (T) executor.submit(task);
}

public synchronized void waitPlease() {
    paused = true;
}

public synchronized void resume() {
    paused = false;
    notify();
}

【讨论】:

  • 谢谢莉亚。您的解决方案看起来不错。我正在尝试这个。会让你知道的。
猜你喜欢
  • 1970-01-01
  • 2012-04-02
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多