codechaser
V2EX  ›  Java

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

  •  
  •   codechaser · Jun 7, 2018 · 3989 views
    This topic created in 2904 days ago, the information mentioned may be changed or developed.
        final Boolean result;
        new Thread(() -> {
    	result = new DaoToUserInfo("porebook").queryUser(user);
        }).start();
    

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

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

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