Java中如何使用await、signal、signalAll对线程进行操作呢?

戚薇 Java经验 发布时间:2023-06-24 15:09:05 阅读数:248 1
下文笔者讲述使用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();
	}
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202306/16875905806880.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者