Java Thread顺序打印123----Lock

Java线程是Java中必须学会的东西。里面有很多面试时必考的知识点。这篇文章从顺序打印123介绍了java中的lock机制。

lock机制是除了synchronized关键字外另一种并发控制方法。

synchronized关键字使用的是对象的固有锁,这个锁是object本身自带的,是wait/notify/notifyAll方法获取和释放的锁。

而lock却是用户创建的,用于精细控制的锁。因为synchronized关键字的控制粒度较大,使用lock锁住临界区称为优选。


顺序打印123使用3个进程,它们共享1个锁对象,使得同事只能有一个线程获得lock对象,实现了123的顺序打印。

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;




public class PrintOneTwo {
	static int state = 1;
	static Lock lock = new ReentrantLock();
	
	static Thread One = new Thread(new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			while (!One.isInterrupted()) {
				lock.lock();
				try {
					if (state % 3 == 1) {
						TimeUnit.MILLISECONDS.sleep(200);
						System.out.print(1);
						state++;
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
					break;
				} finally {
					lock.unlock();
				}
			}
		}
	});

    static Thread Two = new Thread(new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			while (!Two.isInterrupted()) {
				lock.lock();
				try {
					if (state % 3 == 2) {
						TimeUnit.MILLISECONDS.sleep(200);
						System.out.print(2);
						state++;
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
					break;
				} finally {
					lock.unlock();
				}
			}
		}
	});
    
    static Thread Thr = new Thread(new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			while (!Thr.isInterrupted()) {
				lock.lock();
				try {
					if (state % 3 == 0) {
						TimeUnit.MILLISECONDS.sleep(200);
						System.out.print(3);
						state++;
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
					break;
				} finally {
					lock.unlock();
				}
			}
		}
	});
	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		One.start();
		Two.start();
		Thr.start();
		TimeUnit.MILLISECONDS.sleep(10000);
		One.interrupt();
		Two.interrupt();
		Thr.interrupt();
	}

}
为了结束程序,需要向3个进程发送中断请求,并在收到请求后停止线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值