newSingleThreadExecutor 使线程保持值(android)

newSingleThreadExecutor make thread keep values ( android )

我正在使用 java 开发一个 android 应用程序,对于一些重复性任务,我将使用 newSingleThreadExecutor。

不过我希望这个 newSingleThreadExecutor 能在其内部保存一些信息。

例如

public class adder implements Runnable {
    int count;
    @Override
    public void run() {
        count++; 
    }
}

我想post这种任务 但我知道,如果我每次 post 该任务

时都创建该可运行对象的新实例,则不会保留 count 的值

所以我的第一个问题是

  1. 我可以多次使用同一个 Runnable 实例吗?这安全吗?

然而,即使这可能是解决方案,我真的不喜欢将所有重要变量作为单个 Runnable Class 的成员,所以我试图让线程更新一些静态或实例变量(堆)并使它们保留工作线程已更新的值。

例如

public class adder implements Runnable {

    @Override
    public void run() {
        GlobalState.count++; 
    }
}

但我了解到,当一个线程更新一个非局部变量时,它不会直接更新到主内存,除非它被声明为 volatile,而且我还了解到,如果线程没有声明由 newSingleThreadExecutor 创建的线程,则可以销毁该线程很长一段时间没有任何工作,所以我担心线程更新的值在它被销毁之前没有正确保存到主内存中。所以我的第二个问题是

  1. 当线程被销毁时,是否保证所有被线程修改的非本地、堆变量都更新到主内存?

第一个问题:是的,Runnable实例可以在另一个Thread中复用。它只是一个实现 运行() 方法的 class,后者将由 new Thread(myRunnable).start() 调用。从理论上讲,您甚至可以 运行 不同线程并行运行相同的 Runnable,但这根本没有意义。

第二个问题:如果你的GlobalState.count变量被声明为volatile我会假设它确实被立即存储到堆中(或者更准确地说:它将是至少在其他线程访问它时更新为使用的 L1、L2 和 L3 缓存中的正确值。

由于不同的线程会增加全局变量,因此您应该添加一些同步,

synchronized( GlobalState.class) { GlobalState.count++}

在 GlobalState class

中实现一个同步的 incrementCount()

使用 AtomicInteger 来确保对变量的操作在一个线程内以原子方式执行。