当前位置:编程学习 > JAVA >>

线程甲的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相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,