麻煩大佬們 給小弟解釋解釋 這是什么情況?
拜托大佬解惑 謝謝
現象1:Thread.sleep放在同步代碼塊中 睡眠10秒
public class ImplementsRunnable implements Runnable {
private int ticketNums = 10;
private boolean flag = true;
@Override
public void run() {
while(flag){
//買票
try {
buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void buy() throws InterruptedException {
if(ticketNums <= 0){
flag = false;
return ;
}
//睡10秒
Thread.sleep(10000);
System.out.println(Thread.currentThread().getName() + "拿到了第" + ticketNums-- + "票");
}
public static void main(String[] args) {
ImplementsRunnable implementsRunnable = new ImplementsRunnable();
Thread thread = new Thread(implementsRunnable, "小二");
Thread thread1 = new Thread(implementsRunnable, "小三");
Thread thread2 = new Thread(implementsRunnable, "小四");
Thread thread3 = new Thread(implementsRunnable, "小五");
thread.start();
thread1.start();
thread2.start();
thread3.start();
//列印執行緒狀態
while(true){
if((thread.getState() == Thread.State.TERMINATED) ||
(thread1.getState() == Thread.State.TERMINATED) ||
(thread2.getState() == Thread.State.TERMINATED) ||
(thread3.getState() == Thread.State.TERMINATED)
){
break;
}
System.out.println("thread = " + thread.getState());
System.out.println("thread1 = " + thread1.getState());
System.out.println("thread2 = " + thread2.getState());
System.out.println("thread3 = " + thread3.getState());
System.out.println("------------------------------------");
//一次列印 等待10秒
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
現象一結果:

現象二:Thread.sleep方法 放在run方法中 執行
public class ImplementsRunnable implements Runnable {
private int ticketNums = 10;
private boolean flag = true;
@Override
public void run() {
while(flag){
//買票
try {
buy();
//睡10秒
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void buy() {
if(ticketNums <= 0){
flag = false;
return ;
}
System.out.println(Thread.currentThread().getName() + "拿到了第" + ticketNums-- + "票");
}
public static void main(String[] args) {
ImplementsRunnable implementsRunnable = new ImplementsRunnable();
Thread thread = new Thread(implementsRunnable, "小二");
Thread thread1 = new Thread(implementsRunnable, "小三");
Thread thread2 = new Thread(implementsRunnable, "小四");
Thread thread3 = new Thread(implementsRunnable, "小五");
thread.start();
thread1.start();
thread2.start();
thread3.start();
//列印執行緒狀態
while(true){
if((thread.getState() == Thread.State.TERMINATED) ||
(thread1.getState() == Thread.State.TERMINATED) ||
(thread2.getState() == Thread.State.TERMINATED) ||
(thread3.getState() == Thread.State.TERMINATED)
){
break;
}
System.out.println(thread.getName() + "執行緒 = " + thread.getState());
System.out.println(thread1.getName() + "執行緒 = " + thread1.getState());
System.out.println(thread2.getName() + "執行緒 = " + thread2.getState());
System.out.println(thread3.getName() + "執行緒 = " + thread3.getState());
System.out.println("------------------------------------");
//一次列印 等待10秒
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
現象二執行結果:
uj5u.com熱心網友回復:
說一下自己的看法,不一定對1.在同步方法內sleep,sleep完之后應該是釋放了鎖,但之后立馬又拿到了鎖
2.在run方法中去掉睡眠,也是同一個執行緒拿到了鎖,原因應該和上一點一樣
3.狀態列印并不準確
4.如果想要所有執行緒公平獲取鎖,起碼要睡一段小的時間
thread.sleep方法的解釋
使當前執行的執行緒在指定的毫秒數內休眠(臨時停止執行),這取決于系統計時器和調度程式的精度和準確性。執行緒不會失去對任何監視器的所有權。
uj5u.com熱心網友回復:
Thread.sleep不釋放鎖,只有wait才釋放鎖,buy方法用到synchronized,而且是普通方法,所以這把鎖是implementsRunnable 物件,sleep用到方法內,其他執行緒是獲取不到鎖的,用到方法外,說明,當前執行緒已經釋放鎖了,其他執行緒有進入獲取monitor條件了。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/268582.html
標籤:Java SE
上一篇:求助陣列洗掉操作問題
