【发布时间】:2016-07-04 06:37:00
【问题描述】:
我正在尝试设计一个使用 Executors.newSingleThreadExecutor() 制作的工作线程的 android 应用程序
但是我只希望该工作线程处理主线程发送的连续任务,同时保存属于该工作线程的一些信息。 (主线程不需要知道,只是工作线程应该在内部保留该信息。
// State saver class , once made by main thread only accessed by worker thread
public class StateSaver{
public int count;
}
// Runnable obj that will be sent to worker thread from main thread
public class rnbl implements Runnable{
final public StateSaver sv;
public rnbl(StateSaver sv){
this.sv = sv;
}
@Override
public void run(){
sv.count++;
}
}
// Main Thread
ExecutorService ex = Executors.newSingleThreadExecutor();
StateSaver sv = new StateSaver();
public void functionCalledByMainThread(){
ex.submit(new rnbl(sv));
}
但是问题是我发现当 newSingleThreadExecutor 长时间处于空闲状态时,它可能会破坏它创建的线程并在需要时用新线程替换它。
所以我担心的是,如果出现以下情况怎么办? :
工作线程更新了状态变量
变量已在线程缓存内存中更新,但尚未应用于主内存(该变量不应为易失性)
工作线程被销毁
更新永远不会应用于主内存...
那么如果执行器创建一个新线程继续执行任务,保存的状态可能不正确对吧?当然使用 volatile 这应该很容易,但我不需要使用 volatile
或者保证当一个线程被销毁时,它对变量所做的所有更改都会刷新到主内存中?
【问题讨论】:
-
为什么不用
volatile? -
其实我只是有点好奇......也许我应该至少使用一个易失性变量将缓存刷新到主内存
标签: java android multithreading