java在子线程与主线程传递数据
1.代码中用到的类介绍
C:拥有两个方法分别是设置value和获得value,拥有一个私有变量value。
MyThread:子线程
THread:主线程
2.功能说明
在主线程中对类C的实例c的value进行设置,然后输出c.value
开启子线程,通过构造函数传入C的实例c,在子线程中改变c.value的值
子线程中调用主线程的静态方法传递数据给主线程说明子线程执行结束
子线程结束后在主线程中查看c.value
预习知识点:
什么是回调函数?
下面是知乎大神的回答,简直不能再精辟
代码:
package kun.thread; public class THread { static C c=new C(); //flag用来标志子线程执行结束 static boolean flag=false; public static void main(String []arg) { c.setvalue(12); System.out.println("子线程执行之前value的值是:"+c.getvalue()); System.out.println("执行子线程"); Thread mythread = new MyThread(c); mythread.start(); //等待子线程执行结束 while(!flag); System.out.println("子线程执行之后value的值是:"+c.getvalue()); } public static void callback() { System.out.println("子线程执行结束"); flag=true; } } class C { private int value=0; public int getvalue() { return value; } public void setvalue(int v) { this.value=v; } } class MyThread extends Thread { public MyThread(C cc) { this.cc=cc; } private C cc; @Override public void run() { cc.setvalue(20); THread.callback();//很像C#的委托和事件 } }
思考:很多博文说java只有值传递没有引用传递,可是实践来看上述代码中的 c 就是类似C#通过引用传递给了子线程,子线程和主线程操作的是同一个类实例,c作为参数传递给子线程的时候并没有创建c的副本。不过也有博文说是java对象传递的是对象的地址,因此是值传递,没再去深究,貌似只是说法的问题,有空去看看源码深入了解下。
参考资料:
http://blog.csdn.net/asialyf/article/details/49936309
http://www.cnblogs.com/coderworld/p/java-thread-return-information.html