java循环里可以加sleep-java里while循环
发布时间:2023-04-01 10:09 浏览次数:次 作者:佚名
志在以实例的方式描述线程中使用的一些容易混淆概念的方法。
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()阻塞当前线程java循环里可以加sleep,被notify()函数唤醒以后,是从obj.wait()函数继续往下执行呢还是从while()循环继续判断开始呢
上面2例也验证了这个结果java循环里可以加sleep,是从obj.wait()接着往下执行,而不需要再一次从循环开始
4、