多執行緒之初識并發問題
什么是并發:我們模擬一個搶票的例子
public class TextThread3 implements Runnable {
//票數
private int tickName=10;
@Override
public void run() {
while (true){
//如果票數小于10跳出回圈
if(tickName<=0){
break;
}
try {
//延時操作,防止cpu將全部資源分配給同一個人
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
//Thread.currentThread().getName():獲取當前執行緒的名字
System.out.println(Thread.currentThread().getName()+"拿到了第"+tickName--+"張票");
}
}
public static void main(String[] args) {
TextThread3 textThread3=new TextThread3();
new Thread(textThread3, "小明").start();
new Thread(textThread3, "老師").start();
new Thread(textThread3, "黃牛黨").start();
}
}
運行代碼我們會發現:在我們沒有加執行緒鎖的情況下,老師和小明同時搶到了第4張票
解決方案:加執行緒鎖,并使用標志位停止執行緒
*不知道什么的標志位的參考:https://blog.csdn.net/moerduo0/article/details/113803579
修改后的代碼:我們將買票的代碼封裝成一個新的方法buy(),并給它加一個執行緒鎖synchronized
public class TextThread3 implements Runnable {
//票數
private int tickName=10;
//標志位
boolean flag =true;
@Override
public void run() {
//當flag為false停止回圈
while (flag){
try {
//買票
buy();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//執行緒鎖
private synchronized void buy() throws Exception{
//判斷是否有票沒配票時flag為false
if(tickName<=0){
flag=false;
return;
}
//模擬延時
Thread.sleep(100);
//買票
System.out.println(Thread.currentThread().getName()+"拿到了第"+tickName--+"張票");
}
public static void main(String[] args) {
TextThread3 textThread3=new TextThread3();
new Thread(textThread3, "小明").start();
new Thread(textThread3, "老師").start();
new Thread(textThread3, "黃牛黨").start();
}
}
效果:現在就是正常的
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260183.html
標籤:其他
