//這段代碼存在bug,子線程還沒結(jié)束,主線程就調(diào)用了方法,后面的子線程忽然被設(shè)置了100,主線程不會再次調(diào)用,出現(xiàn)了意想不到的結(jié)果
//怎樣才能保證接口在子線程的異步加載,既不去阻塞主線程,又保證子線程的數(shù)據(jù)能及時更新到主線程里
//總體來說這個代碼的bug就是,這個子線程執(zhí)行完畢了,主線程的方法卻沒被再次調(diào)用
public?class?Main2?{
static?String?str?=?"";//?外部內(nèi)存的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();//如果子線程沒結(jié)束完,就讓主線程終止,這種寫法,等于把子線程放在主線程中,無法提高效率,主線程也進(jìn)入未響應(yīng)狀態(tài);
//?}
info.getStr(new?Result2()?{
@Override
public?void?Succes(String?s)?{
str?=?info.num+"--"+s;
}
@Override
public?void?Fail()?{
str?=??info.num+"--失敗"?;
}
});
System.out.println("響應(yīng)碼"?+?str);
}
}
class?threadz?implements?Runnable?{
Info?info;
public?threadz(Info?info)?{
super();
this.info?=?info;
}
@Override
public??void?run()?{
?
//?如果對這個線程進(jìn)行加鎖,那么主線程執(zhí)行了方法,加鎖后這個num默認(rèn)值是0,也不是想要的結(jié)果
//?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();
}
}
}打印的是:響應(yīng)碼200--成功等待一段時間后,子線程真正的結(jié)束,但是主線程運行的結(jié)果不是想要的結(jié)果
接口在線程中的安全性問題如何解決?
qq_慕妹6472843
2017-01-07 12:40:56