java - 如何在Java中暂停/重新启动SingleThreadExecutor(ExecutorService)?

标签 java multithreading concurrency java.util.concurrent

我已经实现了一个单例类“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();
    }
}

最佳答案

如果我理解正确的话,您想要暂停任务的执行,然后执行一些显式任务,然后恢复它。我实际上看到了以下解决方案:

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();
}

关于java - 如何在Java中暂停/重新启动SingleThreadExecutor(ExecutorService)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35377481/

相关文章:

java - 如何迭代可以由另一个线程添加到的列表

java - 如何以 sbt 汇编后可访问的方式打开我的资源目录中的文件?

java - 格式化字符串的最快和最有效的方法

java - 获取 Solr Cloud 集合中的文档数量

java - Spring @ExceptionHandler 测试被调用,但它不是使用错误体而是使用 Mockito 重新抛出异常

c# - 单元测试多线程代码时出现问题

java - 如何清理无休止运行的线程?

sql - TSQL 实现双重检查锁定

concurrency - 并发客户端的 Goroutines 或锁

ios - 什么是 dispatch_queue_create 中的队列属性