newSingleThreadExecutor使线程保持值(android)

时间:2016-07-03 15:11:40

标签: java android multithreading

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

但是我希望这个newSingleThreadExecutor能够保存一些信息。

例如

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

我想发布这类任务 但我知道,如果我每次发布该任务时创建一个可运行的新实例,那么count的值就不会被保留,

所以我的第一个问题是

  1. 我可以多次使用相同的Runnable实例吗?这样安全吗?
  2. 然而,即使这可能是解决方案,我真的不喜欢将所有重要变量作为单个Runnable类的成员,所以我试图让线程更新一些静态或实例变量(堆)并使它们保持工作线程已更新的值。

    例如

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

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

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

1 个答案:

答案 0 :(得分:1)

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

第二个问题:如果您的GlobalState.count变量被声明为volatile,我会认为它确实存储在堆中(或更精确:它将更新为正确的值)至少在其他一些线程访问它时使用了L1,L2和L3缓存。)

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

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

在GlobalState类

中实现同步的incrementCount()

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