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、

阅读更多
想对作者说点什么?

博主推荐

换一批

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