接口在线程中的安全性问题如何解决?

//这段代码存在bug,子线程还没结束,主线程就调用了方法,后面的子线程忽然被设置了100,主线程不会再次调用,出现了意想不到的结果
//怎样才能保证接口在子线程的异步加载,既不去阻塞主线程,又保证子线程的数据能及时更新到主线程里
//总体来说这个代码的bug就是,这个子线程执行完毕了,主线程的方法却没被再次调用

public class Main2 {

static String str = "";// 外部内存的string

public static void main(String[] args) {

Info info = new Info();

threadz z = new threadz(info);
new Thread(z).start();
 

// while(Thread.activeCount()>1){
// Thread.yield();//如果子线程没结束完,就让主线程终止,这种写法,等于把子线程放在主线程中,无法提高效率,主线程也进入未响应状态;
// }

info.getStr(new Result2() {

@Override
public void Succes(String s) {
str = info.num+"--"+s;
}

@Override
public void Fail() {
str =  info.num+"--失败" ;

}
});

System.out.println("响应码" + str);

}
}

class threadz implements Runnable {
Info info;

public threadz(Info info) {
super();
this.info = info;
}

@Override
public  void run() {
 
// 如果对这个线程进行加锁,那么主线程执行了方法,加锁后这个num默认值是0,也不是想要的结果
// synchronized (info) {
// try {
// info.wait();
// } catch (InterruptedException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
info.num = 200;
try {
Thread.sleep(2000);

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
info.num = 100;
// info.notifyAll();
// }

}

}

interface Result2 {
void Succes(String s);

void Fail();
}

class Info {
Result2 result;
int num;

void getStr(Result2 r) {
this.result = r;
if (num == 200) {
r.Succes("成功");
} else {
r.Fail();

}
}
}

打印的是:响应码200--成功

等待一段时间后,子线程真正的结束,但是主线程运行的结果不是想要的结果

qq_慕妹6472843
浏览 1892回答 3
3回答

qq_慕妹6472843

....
打开App,查看更多内容
随时随地看视频慕课网APP