ScheduledExecutorService-更新内部数据

时间:2018-07-13 10:47:41

标签: java android

我有ScheduledExecutorService,我试图在内部更新数据而没有结果

public void myMethod(final String myString) {
    myExecutor.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            System.out.println(myString);
        }
    }, 0, 10000, TimeUnit.MILLISECONDS);
}

现在我想通过以下方式在应用程序的其他位置更改此字符串

myMethod(myString);

现在我有多个线程,有时有旧数据,有时有新数据?
如何解决?

2 个答案:

答案 0 :(得分:1)

一种可能性是关闭您的ExecutorService。这将停止您提交的任务。

myExecutor.shutdown();
myExecutor.shutdownNow();

如果您要再次计划它,则需要创建一个新的ExecutorService难题,因为一旦关闭它就无法重用。然后,您可以使用myString的新值重新安排您的任务。

private void scheduleTask(ExecutorService service, String myString) {
    service.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            System.out.println(myString);
        }
    }, 0, 10000, TimeUnit.MILLISECONDS);
}

答案 1 :(得分:1)

您可以尝试以下方法:

public class Test {
    private static final ScheduledExecutorService EXECUTOR = Executors.newScheduledThreadPool(1); // single instance                
    private static final Lock LOCK = new ReentrantLock(); // for locking
    private static final AtomicBoolean RUNNING = new AtomicBoolean(false);

    private static String globalString;

    public void myMethod(String myString) throws InterruptedException {
        LOCK.lockInterruptibly();

        try {
            globalString = myString;

            if(!RUNNING.get()) {// this will make sure only one runnable runs
                EXECUTOR.scheduleAtFixedRate(() -> {
                    System.out.println(globalString);
                }, 0, 10000, TimeUnit.MILLISECONDS);

                RUNNING.set(true);
            }
        } finally {
            LOCK.unlock();
        }
    }
}

起初不会运行Runnable,所以当第一次调用myMethod时,RUNNING.get()将返回false,因此EXECUTOR将安排Runnable。同样,它将把RUNNING的值翻转为true。之后,对于所有调用,将不会创建新的Runnable,但是myMethod将更新由globalString方法打印的run

LOCK是为了确保只有一个线程可以一次执行Runnable创建和其他操作的逻辑。

在完成工作后,请确保shutdown执行者。