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(); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。