多執行緒學習筆記(狂神說視訊1-7)
阿新 • • 發佈:2020-08-24
執行緒不一定立即執行,由CPU安排排程
多執行緒程式設計:總而言之,多執行緒程式設計是為了滿足程式設計師編寫高效率的程式來達到充分利用 CPU 的目的。
程序與執行緒:
程序:作業系統管理的基本單元。程序包括由作業系統分配的記憶體空間,包含一個或多個執行緒。一個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務。程序執行直到所有的非守護執行緒都結束執行後才能結束。
執行緒:程序中一個單一順序的控制流,並且一個執行緒不能獨立的存在,它必須是程序的一部分。
執行緒建立
- 繼承Thread類
- 實現Runnable介面
- 實現Callable介面
1.建立執行緒方式一
繼承Thread類,重寫run()方法,呼叫start開啟執行緒
public class TestThread01 extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("run方法執行"+i); } } public static void main(String[] args) { TestThread01 testThread01 = new TestThread01(); testThread01.start(); for (int i = 0; i < 100; i++) { System.out.println("主執行緒執行"+i); } } }
執行結果:
2.建立執行緒方式2
實現runnable介面,重寫run方法
執行執行緒需要丟入runnable介面實現類,呼叫start方法
public class TestThread02 implements Runnable{ public void run() { for (int i = 0; i < 100; i++) { System.out.println("run方法執行"+i); } } public static void main(String[] args) { //建立runnable介面的實現類物件 TestThread02 testThread02 = new TestThread02(); Thread thread = new Thread(testThread02); thread.start(); for (int i = 0; i < 100; i++) { System.out.println("主執行緒執行"+i); } } }
執行結果:
3.多執行緒同時操作一個資源(買火車票的例子)
public class TestThread03 implements Runnable {
private int ticketNums = 10;
public void run() {
while (true){
if (ticketNums<=0){
break;
}
//模擬延遲
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"拿到了第"+ ticketNums-- +"張票");
}
}
public static void main(String[] args) {
TestThread03 testThread03 = new TestThread03();
new Thread(testThread03,"張三").start();
new Thread(testThread03,"李四").start();
new Thread(testThread03,"王五").start();
}
}
執行結果:
結論:
多個執行緒操作同一個資源的情況下,執行緒不安全
4.龜兔賽跑的例子
public class TestThread04 implements Runnable {
public void run() {
for (int i = 1; i <= 100; i++) {
//模擬兔子的跑步速度
if (Thread.currentThread().getName() == "兔子") {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
//兔子跑到80米的時候睡了一覺
if (i==80){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"跑了"+i+"米");
}
//模擬烏龜的跑步速度
if (Thread.currentThread().getName() == "烏龜") {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"跑了"+i+"米");
}
if (i==100){
System.out.println(Thread.currentThread().getName()+"到達了終點!!!!!!!");
break;
}
}
}
public static void main(String[] args) {
TestThread04 testThread04 = new TestThread04();
new Thread(testThread04,"兔子").start();
new Thread(testThread04,"烏龜").start();
}
}
執行結果: