執行緒不一定立即執行,由CPU安排調度
多執行緒編程:總而言之,多執行緒編程是為了滿足程式員撰寫高效率的程式來達到充分利用 CPU 的目的,
行程與執行緒:
行程:作業系統管理的基本單元,行程包括由作業系統分配的記憶體空間,包含一個或多個執行緒,一個行程中可以并發多個執行緒,每條執行緒并行執行不同的任務,行程運行直到所有的非守護執行緒都結束運行后才能結束,
執行緒:行程中一個單一順序的控制流,并且一個執行緒不能獨立的存在,它必須是行程的一部分,
執行緒創建
- 繼承Thread類
- 實作Runnable介面
- 實作Callable介面

創建執行緒方式一
繼承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
實作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);
}
}
}
運行結果:

多執行緒同時操作一個資源(買火車票的例子)
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();
}
}
運行結果:

結論:
多個執行緒操作同一個資源的情況下,執行緒不安全
龜兔賽跑的例子
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();
}
}
運行結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/53058.html
標籤:Java
