codechaser
V2EX  ›  Java

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

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

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