1
Kamiyu0087 2019-11-27 18:38:22 +08:00
把 mConnectThread.start(); 放到 synchronized 块里执行
你这 wait() 的时候有可能 notifyAll() 已经跑过了 |
2
gramyang OP @Kamiyu0087 mConnectThread.start()不在 synchronized 块里面啊
|
3
Aruforce 2019-11-27 20:56:46 +08:00 via Android
Synchro 里面的代码块 写 thread.currenthread.wait……你这 Java 真差的可以…
|
4
Aruforce 2019-11-27 20:58:39 +08:00 via Android
#3
synchronized (mConnectThread) { try { Thread.currentThread().wait(); } catch (InterruptedException e) { e.printStackTrace(); } |
5
falsemask 2019-11-27 22:21:39 +08:00
子线程 syn 的 this 是 mConnectThread 对象吗
|
6
falsemask 2019-11-27 22:24:02 +08:00
@Aruforce 你要不要试试你写的代码,你 synchronized 获取了 mConnectThread 的锁,然后在 Thread.currentThread()上 wait,你确定不会抛异常?
|
7
hhx 2019-11-28 01:07:55 +08:00 via Android
简单的线程同步,用初值为 0 的信号量即可,Java 中的 Semaphore。你程序的问题我想一楼的回答是正确的,你自己也说了是异步,走走停停不是一贯到底。
|
10
gramyang OP |
12
GuuJiang 2019-11-28 09:49:17 +08:00
这是一个对 monitor 对象及 wait/notify/notifyAll 等方法的典型误解,要注意这几个方法是定义在 Object 类里的,从逻辑上来说 monitor 对象表示的是你需要控制互斥及同步访问的资源本身,而不是线程,这就是为什么很多代码里会有类似 Object lock = new Object()这样的语句,作为 monitor 的对象只需要跟你想要控制的资源有个一一对应的关系即可,基本不会有把 Thread 对象作为 monitor 的需求
jdk 源码的 Thread.join 方法的注释里有这样一句话 It is recommended that applications not use wait, notify, or notifyAll on Thread instances. |
13
gramyang OP @GuuJiang 关键是我现在的需求就是保证一个线程阻塞直至另一个线程执行完后再执行,而 android 的主线程不允许有任何阻塞的操作,至于是用 object 的 wait 还是 condition 的 wait 还是 future 的 get 没有区别。
|
14
BrokenVns 2019-11-28 12:40:57 +08:00
1.主线程是可以有阻塞操作的,但不建议。
2.我觉得你的 synchronized (mConnectThread)和 synchronized (this)可能不是同一对象,你这个 this 是 Thread 还是 Runnable ?我建议你把这两个对象打印出来看一下。 3.你可以试试定义额外的对象作为锁来试试,比如都使用 synchronized (lockObject) |
15
gramyang OP @BrokenVns mConnectThread 和 this 是同一个对象,this 是 Thread 的子类。synchronized (object)和 synchronized (this)应该是一样的吧?前提是 object 和 this 都是只有一个
|