gpt4 book ai didi

java - 对同步函数的外部调用保持/锁定

转载 作者:行者123 更新时间:2023-11-29 06:17:01 31 4
gpt4 key购买 nike

下面的类 DoStuff 启动一个线程并同步以保护监听器对象在 null 时不被访问。

现在,当从外部访问 DoStuff 类函数 setOnProgressListener() 时,我遇到了问题,因为调用在退出函数调用之前被保持了很长时间。我不确定为什么会这样?我好像同步排队了很多电话?对此的任何输入都会有所帮助!

我实际上是将 null 传递给监听器,因为我不再希望获得此状态的更新。我这样做是为了终止 DoStuff 线程。

谢谢!

public class DoStuff extends Runnable
{
Object MUTEX = new Object();
private OnProgressListener mOnProgressListener = null;

public DoStuff()
{
new Thread(this).start();
}

public void setOnProgressListener( OnProgressListener onProgressListener )
{
synchronized (MUTEX)
{
mOnProgressListener = onProgressListener;
}
}

private void reportStatus( int statusId )
{
synchronized (MUTEX)
{
if (null != mOnStatusListener)
{
mOnStatusListener.setStatusMessage(new OnStatusEvent(this, statusId));
}
}
}

// this is the run of a thread
public void run()
{
int status = 0;
do
{
// do some work and report the current work status
status = doWork();
reportStatus( status );
} while(true);
}
}

最佳答案

你应该使用等待/通知。这是示例;

public class DoStuff {
Object MUTEX = new Object();
String data = null;

public void setData(String data) {
synchronized (MUTEX) {
this.data = data;
System.out.println(Thread.currentThread());
MUTEX.notifyAll();
}
}

public void run() {
do {
synchronized (MUTEX) {
if (null == data) {
return;
} else {
System.out.println(data);
}
try {
MUTEX.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} while (true);
}
}

关于java - 对同步函数的外部调用保持/锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4716977/

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