V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
esolve
V2EX  ›  问与答

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

  •  
  •   esolve · 2017-10-11 16:56:17 +08:00 · 1676 次点击
    这是一个创建于 2607 天前的主题,其中的信息可能已经有所发展或是发生改变。

    譬如下面的 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();
    }
    
    第 1 条附言  ·  2017-10-11 22:40:54 +08:00
    是 java
    10 条回复    2017-10-12 23:31:27 +08:00
    ysc3839
        1
    ysc3839  
       2017-10-11 18:17:01 +08:00 via Android
    请说明编程语言。
    WinterWu
        2
    WinterWu  
       2017-10-11 22:38:22 +08:00
    1. 看起来是 Java 语言
    2. 任何语言,线程间都在同一个进程内-同一个内存空间,所以变量当然也是共享,除了线程变量-这个需要特别指定。
    esolve
        3
    esolve  
    OP
       2017-10-11 22:40:31 +08:00
    @WinterWu 变量不是线程栈内变量么。。。怎么可能共享?
    georgetso
        4
    georgetso  
       2017-10-11 22:53:56 +08:00
    @esolve primitive types are value-passed while object types are reference-passed.
    esolve
        5
    esolve  
    OP
       2017-10-11 23:37:01 +08:00
    @georgetso 这个和我说的问题的关系是?
    SoloCompany
        6
    SoloCompany  
       2017-10-12 02:49:19 +08:00
    你搞混了线程和闭包( lamdba ),你以为自己在问一个线程的问题,其实并不是,java 不支持可写的闭包变量而已,万能的解决办法就是 wrapper
    esolve
        7
    esolve  
    OP
       2017-10-12 11:30:19 +08:00
    @SoloCompany 啊?没看懂你说什么。。。。
    esolve
        8
    esolve  
    OP
       2017-10-12 23:15:46 +08:00
    @SoloCompany

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

    这里闭包涉及到的变量是类变量啊,不是线程栈内变量
    而且是可以改变的变量,不是 final 的
    esolve
        9
    esolve  
    OP
       2017-10-12 23:24:11 +08:00
    @SoloCompany 喔,懂了,线程栈内变量必须 final
    但是很奇怪为何要这样规定?反正用的是副本
    变了有何关系?
    SoloCompany
        10
    SoloCompany  
       2017-10-12 23:31:27 +08:00   ❤️ 1
    @esolve 根本没有线程内变量这个概念,你还是不要跑偏了,Java 里面和线程变量有关的只有 ThreadLocal
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2686 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 07:41 · PVG 15:41 · LAX 23:41 · JFK 02:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.