//这段代码存在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--成功等待一段时间后,子线程真正的结束,但是主线程运行的结果不是想要的结果
添加回答
举报
0/150
提交
取消