为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

//这段代码存在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--成功等待一段时间后,子线程真正的结束,但是主线程运行的结果不是想要的结果
查看完整描述

3 回答

?
qq_慕妹6472843

TA贡献2条经验 获得超0个赞

....

查看完整回答
反对 回复 2017-01-07
  • 3 回答
  • 1 关注
  • 1878 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信