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 的值
所以我的第一个问题是
- 我可以多次使用同一个 Runnable 实例吗?这安全吗?
然而,即使这可能是解决方案,我真的不喜欢将所有重要变量作为单个 Runnable Class 的成员,所以我试图让线程更新一些静态或实例变量(堆)并使它们保留工作线程已更新的值。
例如
public class adder implements Runnable {
@Override
public void run() {
GlobalState.count++;
}
}
但我了解到,当一个线程更新一个非局部变量时,它不会直接更新到主内存,除非它被声明为 volatile,而且我还了解到,如果线程没有声明由 newSingleThreadExecutor 创建的线程,则可以销毁该线程很长一段时间没有任何工作,所以我担心线程更新的值在它被销毁之前没有正确保存到主内存中。所以我的第二个问题是
- 当线程被销毁时,是否保证所有被线程修改的非本地、堆变量都更新到主内存?
第一个问题:是的,Runnable实例可以在另一个Thread中复用。它只是一个实现 运行() 方法的 class,后者将由 new Thread(myRunnable).start() 调用。从理论上讲,您甚至可以 运行 不同线程并行运行相同的 Runnable,但这根本没有意义。
第二个问题:如果你的GlobalState.count变量被声明为volatile我会假设它确实被立即存储到堆中(或者更准确地说:它将是至少在其他线程访问它时更新为使用的 L1、L2 和 L3 缓存中的正确值。
由于不同的线程会增加全局变量,因此您应该添加一些同步,
synchronized( GlobalState.class) { GlobalState.count++}
或 在 GlobalState class
中实现一个同步的 incrementCount()
或使用 AtomicInteger 来确保对变量的操作在一个线程内以原子方式执行。
我正在使用 java 开发一个 android 应用程序,对于一些重复性任务,我将使用 newSingleThreadExecutor。
不过我希望这个 newSingleThreadExecutor 能在其内部保存一些信息。
例如
public class adder implements Runnable {
int count;
@Override
public void run() {
count++;
}
}
我想post这种任务 但我知道,如果我每次 post 该任务
时都创建该可运行对象的新实例,则不会保留 count 的值所以我的第一个问题是
- 我可以多次使用同一个 Runnable 实例吗?这安全吗?
然而,即使这可能是解决方案,我真的不喜欢将所有重要变量作为单个 Runnable Class 的成员,所以我试图让线程更新一些静态或实例变量(堆)并使它们保留工作线程已更新的值。
例如
public class adder implements Runnable {
@Override
public void run() {
GlobalState.count++;
}
}
但我了解到,当一个线程更新一个非局部变量时,它不会直接更新到主内存,除非它被声明为 volatile,而且我还了解到,如果线程没有声明由 newSingleThreadExecutor 创建的线程,则可以销毁该线程很长一段时间没有任何工作,所以我担心线程更新的值在它被销毁之前没有正确保存到主内存中。所以我的第二个问题是
- 当线程被销毁时,是否保证所有被线程修改的非本地、堆变量都更新到主内存?
第一个问题:是的,Runnable实例可以在另一个Thread中复用。它只是一个实现 运行() 方法的 class,后者将由 new Thread(myRunnable).start() 调用。从理论上讲,您甚至可以 运行 不同线程并行运行相同的 Runnable,但这根本没有意义。
第二个问题:如果你的GlobalState.count变量被声明为volatile我会假设它确实被立即存储到堆中(或者更准确地说:它将是至少在其他线程访问它时更新为使用的 L1、L2 和 L3 缓存中的正确值。
由于不同的线程会增加全局变量,因此您应该添加一些同步,
synchronized( GlobalState.class) { GlobalState.count++}
或 在 GlobalState class
中实现一个同步的 incrementCount()或使用 AtomicInteger 来确保对变量的操作在一个线程内以原子方式执行。