yutaoaijingjing132 2011-09-26 10:41
浏览 266
已采纳

关于多线程问题,signalAll,await问题

 

package ThreadTest;

 

import java.util.concurrent.TimeUnit;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

 

public class AwaitTest1 extends Thread{

private final Lock lock = new ReentrantLock();

private Condition waitCondition = lock.newCondition();

public static void main(String[] args) throws InterruptedException {

new AwaitTest1().threads();

}

public void threads() throws InterruptedException {

Thread t1 = new Thread(){

public void run(){

try {

lock.lock();

System.out.println("do somthing xxx long time");

waitCondition.signalAll();

System.out.println("sign other");

Thread.sleep(500);

lock.unlock();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

};

Thread t2 = new Thread(){

public void run(){

System.out.println(waitResult());

}

};

t1.start();

t2.start();

}

public Boolean waitResult() {

System.out.println("x");

lock.lock();

Boolean result = false;

try {

System.out.println("y");

result = waitCondition.await(1000, TimeUnit.MILLISECONDS);

} catch (InterruptedException e) {

e.printStackTrace();

}

lock.unlock();

return result;

}

}

 

说下我写这个目的,我也是才学学习多线程,在此遇到了不少问题,我本来想些个异步的通信 就是说当我运行线程T1的时候,他唤醒T2,就像是Future那个异步回调,但是不知道该如何写,也不知道这个result什么时候返回true,我感觉是当线程T1完成复杂的计算后,然后在await在没有超时的情况下,会返回为true,但是现在我程序写的有问题,请各位帮忙解决下,谢谢


  • 写回答

1条回答 默认 最新

  • _1_1_7_ 2011-09-26 11:28
    关注

    要想获得你预期的结果,就必须是
    t2先获得锁(lock.lock()),然后执行 waitCondition.await,释放锁并等待信号;t1获得锁执行完相关操作后执行waitCondition.signalAll,t2从而获得锁继续执行,此时如果等待时间未超时就返回true.
    await时间应该比t1执行时间长。
    [code="java"]

    import java.util.concurrent.TimeUnit;

    import java.util.concurrent.locks.Condition;

    import java.util.concurrent.locks.Lock;

    import java.util.concurrent.locks.ReentrantLock;

    public class AwaitTest {

    private final Lock lock = new ReentrantLock();
    
    private Condition waitCondition = lock.newCondition();
    
    public static void main(String[] args) throws InterruptedException {
    
        new AwaitTest().threads();
    
    }
    
    public void threads() throws InterruptedException {
        final Thread t1 = new Thread() {
            public void run() {
                try {
                    lock.lock();
                    System.out.println("do somthing...");
                    Thread.sleep(1000);
                    waitCondition.signal();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
        };
    
        Thread t2 = new Thread() {
            public void run() {
    
                System.out.println(waitResult());
    
            }
        };
    
    
        t2.start();
        //保证t2先开始
        Thread.sleep(1000);
        t1.start();
    }
    
    public boolean waitResult() {
        boolean result = false;
        lock.lock();
        try {
            result = waitCondition.await(3000, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
        return result;
    }
    

    }

    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵