Java中如何使用await、signal、signalAll对线程进行操作呢?
下文笔者讲述使用await、signal、signalAll对线程的操作分享,如下所示
例
例
package locktest;
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 TestLock2 {
private Lock lock = new ReentrantLock();
private Condition lockCondition = lock.newCondition();
private int result;
public int start() {
System.out.println("start");
result = -1;
lock.lock();
System.out.println("start condition.await 3s");
try {
lockCondition.await(3,TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
return result;
}finally {
lock.unlock();//异常也得释放锁
}
if(result == -1) {
result = 2;//超时
System.out.println("start 超时:"+result);
return result;
}else if(result == 0 || result == 1){
System.out.println("start 结果:"+result);
return result;
}else {
result = -1;
System.out.println("start 异常结果:"+result);
return result;
}
}
public void stop(int x) {
System.out.println("stop");
if(result != 2) {
lock.lock();
result = x;
System.out.println("stop condition.signal 结果:"+result);
lockCondition.signal();
lock.unlock();
}
}
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
TestLock2 test1 = new TestLock2();
new Thread(new Runnable() {
@Override
public void run() {
test1.start();
}
}).start();
Thread.sleep(2000);
new Thread(new Runnable() {
@Override
public void run() {
test1.stop(0);
}
}).start();
Thread.sleep(5000);
System.out.println("===========================================");
TestLock2 test2 = new TestLock2();
new Thread(new Runnable() {
@Override
public void run() {
test2.start();
}
}).start();
Thread.sleep(2000);
new Thread(new Runnable() {
@Override
public void run() {
test2.stop(1);
}
}).start();
Thread.sleep(5000);
System.out.println("===========================================");
TestLock2 test3 = new TestLock2();
new Thread(new Runnable() {
@Override
public void run() {
test3.start();
}
}).start();
Thread.sleep(3500);
new Thread(new Runnable() {
@Override
public void run() {
test3.stop(0);
}
}).start();
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


