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、

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试