文章标题看起来是一个错误命题,因为在java的内存模型中方法的局部变量是放在线程私有的栈里的。下图是java虚拟机的内存模型:
那么如何访问呢?这当然是有前提的,首先必须是内部类,局部变量必须加final修饰符。看代码示例:
public class FinalTest { public static void main(String[] args) { new FinalTest().test(); Thread t = Thread.currentThread(); System.out.println("Thread" + t.getId() + ":主线程结束"); // 执行到此处,主线程结束 } public void test() { // 定义一个局部变量 final int var = 1; final int[] refer = {1}; // 在内部类里访问局部变量var和refer new Thread(new Runnable() { public void run() { for (int i = 0; i < 10; i++) { // 此处将一直可以访问到var局部变量 Thread t = Thread.currentThread(); System.out.println("Thread" + t.getId() + ":" + (var + i));//实际上编译后是System.out.println(1 + i) //引用类型局部变量 System.out.println("Thread" + t.getId() + ":" + refer +"="+ (refer[0] + i)); // 暂停0.1秒 try { Thread.sleep(100); } catch (Exception ex) { ex.printStackTrace(); } } } }).start(); new Thread(new Runnable() { public void run() { for (int i = 0; i < 5; i++) { //var = var + i;//不能修改 //引用类型虽然不让修改变量的引用地址,但是可以修改变量里的内容 //refer = {i};//不允许 refer[0] = i;//允许 // 暂停0.2秒 try { Thread.sleep(200); } catch (Exception ex) { ex.printStackTrace(); } } } }).start(); System.gc();//主线程执行完毕后,通知虚拟机垃圾回收,此时无论线程执行多久,var和refer都不会被回收掉 } }
不启动第二个线程时运行结果如下:
Thread1:主线程结束 Thread8:1 Thread8:[I@69b332=1 Thread8:2 Thread8:[I@69b332=2 Thread8:3 Thread8:[I@69b332=3 Thread8:4 Thread8:[I@69b332=4 Thread8:5 Thread8:[I@69b332=5 Thread8:6 Thread8:[I@69b332=6 Thread8:7 Thread8:[I@69b332=7 Thread8:8 Thread8:[I@69b332=8 Thread8:9 Thread8:[I@69b332=9 Thread8:10 Thread8:[I@69b332=10
启动第二个线程时运行结果如下:
Thread8:1 Thread1:主线程结束 Thread8:[I@173a10f=0 Thread8:2 Thread8:[I@173a10f=1 Thread8:3 Thread8:[I@173a10f=3 Thread8:4 Thread8:[I@173a10f=4 Thread8:5 Thread8:[I@173a10f=5 Thread8:6 Thread8:[I@173a10f=7 Thread8:7 Thread8:[I@173a10f=8 Thread8:8 Thread8:[I@173a10f=10 Thread8:9 Thread8:[I@173a10f=11 Thread8:10 Thread8:[I@173a10f=13
相关推荐
Unity异步线程调用主线程脚本程序,在Unity中异步线程调用主线程会报错,所以编写了一个Loom
C#多线程互斥实例 多线程获取同一变量(不重复)。是一个很好的学习例子
Java多线程--让主线程等待所有子线程执行完毕
自己学着编写的一个JAVA多线程程序,该程序实现的功能是:在主线程main中创建两个子线程,A和B,线程A先运行,再运行B线程,当两个子线程都运行完毕后,才运行主线程,并最终结束整个程序的运行。 希望该程序对初学...
子线程更新主线程数据(再谈多线程)
1.Qt下,多线程使用互斥锁安全访问同一全局变量;2.源码中定义了ThreadA和ThreadB,定义变量后,依次调用函数start()来启动重写的run()函数
局部变量 线程 安全 测试 源码,用多线程测试局部变量是否线程安全。
此代码采用直接给线程变量赋值不需要参数传递
通过主线程,调用子线程,然后子线程再调用主线程,通过主线程的两个变量,来判断退出标志,让主线程可以退出。
qt 多线程 防止主线程做循环操作导致界面假死。试过多线程的几种方法,只有这个方法可行。代码亲测可行。在子线程死循环,界面正常不死!!!
c#子线程如何读取及设置主线程ui的值,自己录的一个小视频,方便理解,比较菜鸟的方法,请勿喷!
NULL 博文链接:https://dsqiu.iteye.com/blog/2028503
多线程计数实现多线程执行后再执行主线程,在项目中实际应用。
C++ thread退出线程 多线程 子线程控制退出主线程 window VS2017 Debug Error! Abort() has been called. C++ thread退出线程 多线程 子线程控制退出主线程 window VS2017 Debug Error! Abort() has been called.
Handler消息传递详解,子线程到子线程,主线程到子线程,子线程到主线程 三种消息,Looper,Handler工作机制详解 https://blog.csdn.net/shoneworn/article/details/80447651
以一个简单的计数程序为例,主线程通过全局变量控制工作线程的技术速度,工作线程通过自定义消息与主线程进行通信
C#子线程刷新主线程示例源码 功能介绍: 使用线程操作 1、实时显示当前时间 2、输入加数和被加数,自动出现... 使用了多线程实现了子线程刷新主线程 ,使用委托刷新主线程。 注意: 开发环境为Visual Studio 2012
子线程任务发生异常,主线程事务如何回滚
对于多线程而言,一个主要的难题就是如何线程是否都已经执行结束。 也就是说,需要在主线程开启子多线程后,直到子线程全部执行结束为止,回到主线程。
目标:在一个线程运行的时候,主程序或者另一个线程,通过改变全局变量实时改变目标变量的做法,在linux下用make编译