gpt4 book ai didi

java - Android中HandlerThread的安全性

转载 作者:行者123 更新时间:2023-12-01 11:56:20 25 4
gpt4 key购买 nike

好吧,这是一个我认为不需要问的问题,但要么是工作时间太长,要么是什么,但我的头脑很模糊,所以就这样吧。

创建一个带有 HandlerThread、Looper 和 Handler 的类:

public class MyClass {
//private volatile boolean mRunning = false;
private boolean mRunning = false;
private HandlerThread mHandlerThread = null;
private Handler mMessageHandler = null;

public static final int MESSAGE_START = 1;
public static final int MESSAGE_STOP = 2;

public MyClass() {
mHandlerThread = new HandlerThread("com.test.myclass");
mHandlerThread.start();
mMessageHandler = new MessageHandler(mHandlerThread.getLooper());
}

private class MessageHandler extends Handler {
public MessageHandler(Looper looper) {
super(looper);
}

private void start() {
mRunning = true;
}

private void stop() {
mRunning = false;
}

@Override
public void handleMessage(final Message msg) {
try {
switch (msg.what) {
case MESSAGE_START:
start();
break;

case MESSAGE_STOP:
stop();
break;

default:
throw new RuntimeException("Invalid message: " + msg.what);
}
} catch (RuntimeException e) {
stop();
}
}
}

public void release() {
if (isRunning()) {
stop();
}

// PS: is this a good way to stop HandlerThead/Looper in API =< 17 ?
if (mHandlerThread != null) {
mHandlerThread.quit();
mHandlerThread = null;
}
}

// Should this be a synchronized method
public boolean isRunning() {
return mRunning;
/**
* Or should the variable be synchronized itself?
* synchronized(mRunning) { return mRunning; }
*/

// Or just use a semaphore?
}

public void start() {
mMessageHandler.sendEmptyMessage(MESSAGE_START);
}

public void stop() {
mMessageHandler.sendEmptyMessage(MESSAGE_STOP);
}
}

因此,mRunning 被两个线程(主线程和循环线程)访问。因此,访问应该是同步的。你会选择哪种方式?使变量可变(以便两个线程都具有最新的本地值),使 isRunning 方法同步?或者通过 synchronized(mRunning){...} 访问变量?

最后,实现release方法,符合标准吗?或者您会选择任何其他方式?

最佳答案

如果锁的争用较低,则同步锁的成本与 volatile 访问的成本大致相同。如果争用很高,那么 volatile 版本可能会表现更好。

但是你不能这样做:

synchronized(mRunning) { ... }  //ERROR!

mRunning 是一个 boolean 表达式。您无法同步 boolean 值,只能同步对象。

关于java - Android中HandlerThread的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28420859/

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