以下是我的应用程序的启动/停止过程,启动/停止代码由单线程的ThreadPoolExecutor处理,因此我保证同一时间只有一个线程可以处于活动状态。
我问的是isRunning变量。 将变量设置为volatile是否足够?
该变量将从不同的线程访问(但同时只有一个!)
编辑: 添加变量读取(startProcedure()和stopProcedure()的开头)。 我忘了那部分,对此我表示歉意。
编辑2: 我认为可能很难注意到,但startProcedure()和stopProcedure()是用于创建startQuery和stopQuery的函数-线程使用的可运行项。
编辑: 添加变量读取(startProcedure()和stopProcedure()的开头)。 我忘了那部分,对此我表示歉意。
编辑2: 我认为可能很难注意到,但startProcedure()和stopProcedure()是用于创建startQuery和stopQuery的函数-线程使用的可运行项。
public final class Work {
private static final ThreadPoolExecutor processor = new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1),
new ThreadPoolExecutor.DiscardPolicy());
private static final Runnable startQuery = Work::startProcedure,
stopQuery = Work::stopProcedure;
private static boolean isRunning = false;
private Work() {}
private static void startProcedure() {
if (isRunning) return;
isRunning = true;
//<some code>
}
private static void stopProcedure() {
if (!isRunning) return;
//<some code>
isRunning = false;
}
//------Public API
public static void start() {
processor.execute(startQuery);
}
public static void stop() {
processor.execute(stopQuery);
}
}
startProcedure()
和stopProcedure()
的开头添加了它。 - WLTYstartProcedure()
和stopProcedure()
正在被线程使用,没有其他代码线程执行。 - WLTY