在一个线程 A 内新开线程 B,线程 A 如何给线程 B 传参?

2017-10-11 16:56:17 +08:00
 esolve

譬如下面的 i, s 好像是能被新线程复制过去 这些变量有何注意事项吗,貌似强制需要时 final 的 如果不是 final 的呢?

 public static void main(String[] args) {
    int i = 0;
    Set<String> s =new HashSet<>();
    s.add("one");
    new Thread(new Runnable() {
        @Override
        public void run() {
            func(i, s)
        }
    }).start();
}
1669 次点击
所在节点    问与答
10 条回复
ysc3839
2017-10-11 18:17:01 +08:00
请说明编程语言。
WinterWu
2017-10-11 22:38:22 +08:00
1. 看起来是 Java 语言
2. 任何语言,线程间都在同一个进程内-同一个内存空间,所以变量当然也是共享,除了线程变量-这个需要特别指定。
esolve
2017-10-11 22:40:31 +08:00
@WinterWu 变量不是线程栈内变量么。。。怎么可能共享?
georgetso
2017-10-11 22:53:56 +08:00
@esolve primitive types are value-passed while object types are reference-passed.
esolve
2017-10-11 23:37:01 +08:00
@georgetso 这个和我说的问题的关系是?
SoloCompany
2017-10-12 02:49:19 +08:00
你搞混了线程和闭包( lamdba ),你以为自己在问一个线程的问题,其实并不是,java 不支持可写的闭包变量而已,万能的解决办法就是 wrapper
esolve
2017-10-12 11:30:19 +08:00
@SoloCompany 啊?没看懂你说什么。。。。
esolve
2017-10-12 23:15:46 +08:00
@SoloCompany

我看了这篇文章
http://www.cnblogs.com/ssp2110/p/3797666.html

这里闭包涉及到的变量是类变量啊,不是线程栈内变量
而且是可以改变的变量,不是 final 的
esolve
2017-10-12 23:24:11 +08:00
@SoloCompany 喔,懂了,线程栈内变量必须 final
但是很奇怪为何要这样规定?反正用的是副本
变了有何关系?
SoloCompany
2017-10-12 23:31:27 +08:00
@esolve 根本没有线程内变量这个概念,你还是不要跑偏了,Java 里面和线程变量有关的只有 ThreadLocal

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/396826

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX