java线程的一点感悟(sleep,wait,synchronized,时间片等)

志在以实例的方式描述线程中使用的一些容易混淆概念的方法。

1、sleep()方法不释放锁

public class SleepFunction {
	static final Object obj = new Object();
public static void main(String[] args) {
	
	new Thread(new Runnable() {
		public void run() {
			
	        synchronized (obj) {
				System.out.println("new thread join");
				obj.notify();
				System.out.println("new thread end");
			}
		}
	}).start();
	while (true) {
		synchronized (obj) {
		System.out.println("begin");
		
		
			try {
				Thread.sleep(3000);  //sleep 不释放锁
				//obj.wait();      //释放锁
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("one loop end");
		}
	}
}
}

输出结果:

begin
one loop end
begin
one loop end
begin
one loop end
begin
one loop end
begin
one loop end
begin
one loop end
.....

主线程将一直打印下去,永远结束不了,而子线程没有机会执行

2、wait()方法释放锁

public class SleepFunction {
	static final Object obj = new Object();
public static void main(String[] args) {
	
	new Thread(new Runnable() {
		public void run() {
			
	        synchronized (obj) {
				System.out.println("new thread join");
				obj.notify();
				System.out.println("new thread end");
			}
		}
	}).start();
	while (true) {
		synchronized (obj) {
		System.out.println("begin");
		
		
			try {
				//Thread.sleep(3000);  //sleep 不释放锁
				obj.wait();      //释放锁
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("one loop end");
		}
	}
}
}

输出结果:

begin
new thread join
new thread end
one loop end
begin

主线程释放锁,子线程执行结束以后,主线程永远阻塞

3、不知道大家有没有一个混淆的地方,就是调用锁obj.wait()阻塞当前线程,被notify()函数唤醒以后,是从obj.wait()函数继续往下执行呢还是从while()循环继续判断开始呢

上面2例也验证了这个结果,是从obj.wait()接着往下执行,而不需要再一次从循环开始

4、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值