关于多线程问题,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,但是现在我程序写的有问题,请各位帮忙解决下,谢谢


要想获得你预期的结果,就必须是
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]