gpt4 book ai didi

java - newSingleThreadExecutor 使线程保持值(android)

转载 作者:行者123 更新时间:2023-11-30 01:13:38 25 4
gpt4 key购买 nike

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

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

例如

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

我想发布这样的任务但我知道,如果我每次发布该任务时都创建该可运行对象的新实例,则不会保留 count 的值,

所以我的第一个问题是

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

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

例如

public class adder implements Runnable {

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

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

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

最佳答案

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

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

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

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

在 GlobalState 类中实现一个同步的 incrementCount()

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

关于java - newSingleThreadExecutor 使线程保持值(android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38171306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com