线程甲的notify唤醒不了另一个wait的线程乙
想做一个数据分包传输时确认重传的东西,甲客户端读取文件发数据给乙,分包发,发一包后就wait,乙收到数据后返回一个ACK给甲,甲收到ACK后notify,然后接着发数据包。发送端甲的notify遇到问题了
用了两个Activity,MainActivity发数据,BottomActivity接收数据。
MainActivity.java的sendThread的run里发送一组数据,wait
BottomActivity.java的read_Thread的run里接收到确认信号,notify
在BottomActivity里设置了
public volatile Boolean ACK = false;作为套在wait外边的while的条件
public Object lockObject = new Object();作为同步用的锁
为什么BottomActivity里的read_Thread的notify唤醒不了MainActivity的sendThread?
BottomActivity.java中的read_thread线程一开始就工作,
MainActivity.java里的send_thread线程后来启动的。
------------------------------------------
BottomActivity.java中的read_thread线程如下:
private class read_thread extends Thread {
public void run() {
while ( true) {
Log.e(">>@@", "进入read_thread的run函数");
try {
if (instream != null) {
readcount = instream.read(data, 0, 64);//监听乙发过来的ACK
if (readcount > 0)// 有数据到来
{
synchronized (lockObject) {
if (data里收到的是确认ACK) {
ACK = true;
lockObject.notifyAll();//唤醒MainActivity里的发送线程
Log.e(">>@@", "将确认ACK置为true,唤醒MainActivity里的线程");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
MainActivity.java里的send_thread线程
Create(){
bottomActivity=new BottomActivity(MainActivity.this);
}
private class send_file_thread extends Thread
{
public void run()
{
byte [] senddata = new byte[64];
try{
if(instream != null)
{
readcount = instream.read(senddata,0,64);//从文件里读取64字节的数据
Log.e(">>@@","读取数据包");
while(readcount > 0)
{
SendData(readcount, senddata);//发送数据
Log.e(">>@@","发送数据包");
Log.e(">>@@","即将进入锁定块");
synchronized (bottomActivity.lockObject) {
while (!bottomActivity.ACK) {//如果ACK是false,发送线程就等待,直到ACK变成true
Log.e(">>@@","发送线程等待ACK的到来");
try {
bottomActivity.lockObject.wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
bottomActivity.ACK = false;
}
readcount = instream.read(senddata,0,64);//从文件里再读取64字节的数据
}
}
}catch (IOException e){}
}
}
}
观察了输出的信息
发现发送线程没有进入这块代码,连wait的面都没见着。后来read_thread的notify对它也没用。
synchronized (bottomActivity.lockObject) {
while (!bottomActivity.ACK) {//如果ACK是false,发送线程就等待,直到ACK变成true
Log.e(">>@@","发送线程等待ACK的到来");
try {
bottomActivity.lockObject.wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
bottomActivity.ACK = false;
}
请问这是为什么。。。我的锁设置的有问题吗? 多线程 Java wait notify
补充:Java , Java相关