V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codechaser
V2EX  ›  Java

Java 中怎么在一个线程里设定一个外部布尔变量的值?

  •  
  •   codechaser · 2018 年 6 月 7 日 · 3842 次点击
    这是一个创建于 2775 天前的主题,其中的信息可能已经有所发展或是发生改变。
        final Boolean result;
        new Thread(() -> {
    	result = new DaoToUserInfo("porebook").queryUser(user);
        }).start();
    

    像上面这样,新线程里比对两个对象是否一致,queryUser(User user)返回数据库里面是否存在该用户。但是因为时匿名类,result 已经被加了 final,那么怎么获取这个返回的布尔值呢?

    21 条回复    2018-06-08 12:17:21 +08:00
    colincat
        1
    colincat  
       2018 年 6 月 7 日
    为什么明明应该是同步来做的,要改成异步,还有多线程编程了解一下 :)
    codechaser
        2
    codechaser  
    OP
       2018 年 6 月 7 日
    @colincat 您好!我在学习 Java,不是说查询数据库这些操作最好要用多线程吗?如果是同步操作的话能否给个提示?
    colincat
        3
    colincat  
       2018 年 6 月 7 日
    @codechaser 数据库只是连接是使用线程池啊,从线程池中取一个线程,也是拿到结果以后再执行下面的步骤啊,可能有所差别,大体原理是这样的
    colincat
        4
    colincat  
       2018 年 6 月 7 日
    @codechaser 找本书先看看吧
    donyee
        5
    donyee  
       2018 年 6 月 7 日
    AtomicBoolean 是不是能解决这个,不过一般不会这么查询数据库
    直接同步查询就好
    codechaser
        6
    codechaser  
    OP
       2018 年 6 月 7 日
    @donyee 直接这样吗?
    ```java
    Boolean ss;
    ss = new DaoToUserInfo("porebook").queryUser(user);
    ```
    BBCCBB
        7
    BBCCBB  
       2018 年 6 月 7 日
    用个对象包装一下才可以.
    BBCCBB
        8
    BBCCBB  
       2018 年 6 月 7 日
    将你的 boolean 类型的变量放到一个对象里, 然后在线程中修改这个对象里的这个 boolean 值就没问题了
    StarainX
        9
    StarainX  
       2018 年 6 月 7 日
    boolean [] result = { false };

    result[0] = ....
    chocotan
        10
    chocotan  
       2018 年 6 月 7 日
    AtomicBoolean+1
    codechaser
        11
    codechaser  
    OP
       2018 年 6 月 7 日
    @BBCCBB 谢谢!这个确实可以。
    codechaser
        12
    codechaser  
    OP
       2018 年 6 月 7 日
    @chocotan 谢谢!
    tianlang1989
        13
    tianlang1989  
       2018 年 6 月 7 日
    其实在 Android studio 里面,你这样写提示报错以后,IDE 默认的修改策略就是设置一个 final 的数组,然后改数组[0]
    codechaser
        14
    codechaser  
    OP
       2018 年 6 月 7 日
    @chocotan 谢谢!我去查一下。
    twoyuan
        15
    twoyuan  
       2018 年 6 月 7 日
    基本就是楼上说的这些了( Kotlin 就不用这么别扭
    D3EP
        16
    D3EP  
       2018 年 6 月 7 日
    按理说,你需要的是一个 Future
    jimrok
        17
    jimrok  
       2018 年 6 月 7 日
    需要个 Future,线程执行的时候,外面的 result 也许已经被垃圾回收了。
    frienmo
        18
    frienmo  
       2018 年 6 月 7 日   ❤️ 1
    1.Thread 或者 Runnable 只能执行 return void 的代码
    2.于是又来 Future 的类用来获取返回类型 Future<R>
    3.再后来又要获取这个执行过程是否完成,就有了 CompletableFuture
    xmh51
        19
    xmh51  
       2018 年 6 月 7 日
    楼主的场景 数据应该不是直接用 jdbc 吧。如果用了数据库连接池 这里面不需要再搞多线程
    oska117
        20
    oska117  
       2018 年 6 月 8 日 via Android
    一般都是 把这
    oska117
        21
    oska117  
       2018 年 6 月 8 日 via Android
    一般都是 用数组就包含一个值,然后修改这个数组[0],当然,你也可以新建个对象,然后操作这个对象属性
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   864 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:47 · PVG 04:47 · LAX 12:47 · JFK 15:47
    ♥ Do have faith in what you're doing.