我有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);
现在我有多个线程,有时有旧数据,有时有新数据?
如何解决?
答案 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
执行者。