多线程的同步

多线程的同步

一般来说,线程默认都是异步执行,也就是再执行的过程中,多个线程会抢CPU,会导致电脑崩溃的现象,而使用线程同步后,每个线程会按照一定的次序来运行。
举个例子来说,上班挤公交就是生活常见的现象。线程默认的异步,也就是现在有很多人(假设10人)同时在挤公交,有可能会发生意外冲突,而线程同步是10个人排着队按照一定的次序上车,不会产生冲突现象。

public class Test1 {
	//线程执行
	static int state = 0;
	//设置锁
	static Object lock = new Object();
	private static class PrintTask implements Runnable{
		/**当前标志位*/
		private int nowFlag;
		/**下一个标志位*/
		private int nextFlag;
		/**当前线程打印的字符串*/
		private String printString;
		
		public PrintTask(int nowFlag, int nextFlag, String printString) {
			this.nowFlag = nowFlag;
			this.nextFlag = nextFlag;
			this.printString = printString;
		}

		@Override
		public void run() {
			for (int i = 0; i < 10; i++) {
				synchronized (lock) {
					//当前线程与线程执行的不一致时,线程处于阻塞状态
					while(state != nowFlag) {
						try {
							lock.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					//打印字符串
					System.out.println(printString);
					//改变标志位
					state = nextFlag;
					//通知所有线程
					lock.notifyAll();
				}
			}
		}
	}
public static void main(String[] args) {
	//第一个要从0开始是因为上面定义的线程state = 0
	//然后每一次上一个线程的第一个位置与上一个线程的下一个位置要相同
	//这是每次再执行完线程后修改了标志位state = nextFlag;
	//在后面还可以添加更多的线程,线程安全并且会按照次序运行
	Thread t1 = new Thread(new PrintTask(0, 1, "A"));
	Thread t2 = new Thread(new PrintTask(1, 5, "B"));
	Thread t3 = new Thread(new PrintTask(5, 3, "C"));
	Thread t4 = new Thread(new PrintTask(3, 0, "D"));
	t1.start();
	t2.start();
	t3.start();
	t4.start();
}

}
`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值