多執行緒基礎知識
程式和執行緒
程式是一個應用程式;執行緒是應用程式中的執行單元。
一個程式可以由多個執行緒,最基本的包括主執行緒和垃圾回收執行緒。
一個執行緒佔一個棧空間,不同棧空間相互獨立,互不共享,堆和方法區記憶體是對這些棧是共享的。JVM記憶體結構
所以可以看出,main函式(主執行緒)結束不代表執行緒結束,因為還有其它分支執行緒進行彈棧壓棧操作。
執行緒的建立方法
1.建立一個Thread類的子類,並重寫run()方法
2.實現Runnable介面,重寫run()方法,並用new Thread(實現介面的物件)進行封裝
3.使用匿名類的形式快速實現Runnable介面,並進行封裝
執行緒的執行狀態
五種狀態:新建狀態——就緒狀態——執行狀態——阻塞狀態——死亡狀態。
new Thread()標誌著為新建狀態;
start()標誌著進入就緒狀態,又叫做可執行狀態,擁有搶奪CPU時間片的權利(執行權),當搶到了一塊CPU時間片之後,就開始執行run方法;
run()標誌著進入執行狀態,當這個時間片用完之後會再次回到就緒狀態,然後重新搶奪時間片並繼續run方法的執行(run的內容不會再次從頭開始執行);
遇到阻塞事件(使用者輸入或者sleep)標誌著進入阻塞狀態,放棄當前的時間片,回到就緒狀態重新奪取時間片;
run()的內容執行完之後就進行死亡狀態。
執行緒的sleep,interrupt和終止執行緒
sleep()函式是靜態方法,作用是對當前執行緒(所處的程式碼塊決定)進行休眠。interrupt()函式是非靜態方法,可以中斷執行緒中的休眠時間這種方式是通過Java的異常處理機制來實現的。
多執行緒併發
真正的多執行緒併發是指同一時間點有多個執行緒同時執行。對於單核CPU一次只能執行一個執行緒,系統會對多個執行緒進行排程,線上程之間來回切換,在巨集觀上看來像是在同時執行。
併發: 當有多個執行緒在操作時,如果系統只有一個CPU,則它根本不可能真正同時進行一個以上的執行緒,它只能把CPU執行時間劃分成若干個時間段,再將時間 段分配給各個執行緒執行,在一個時間段的執行緒程式碼執行時,其它執行緒處於掛起狀。.這種方式我們稱之為併發(Concurrent)。
並行: 當系統有一個以上CPU時,則執行緒的操作有可能非併發。當一個CPU執行一個執行緒時,另一個CPU可以執行另一個執行緒,兩個執行緒互不搶佔CPU資源,可以同時進行,這種方式我們稱之為並行(Parallel)。
package birda;
//建立執行緒的三種方法
public class Mythread extends Thread{
@Override
public void run() {
for(int i=0;i<1000;i++) {
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//繼承Thread
Mythread t1=new Mythread();
t1.setName("t1執行緒");
t1.start();
for(int i=0;i<1000;i++) {
System.out.println("主執行緒--->"+i);
}
try {
Thread.sleep(1000*5);//當前執行緒睡眠;此時當前執行緒為主執行緒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("開始執行t2執行緒的內容");
//實現Runnable介面
Thread t2=new Thread(new MyRunnable());
t2.setName("t2執行緒");
t2.start();
try {
Thread.sleep(1000*5);//當前執行緒睡眠;此時當前執行緒為主執行緒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("開始執行t3執行緒的內容");
//匿名類的形式建立執行緒
Runnable r=new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "--->" + i);
}
try {
Thread.sleep(1000 * 60);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
}
System.out.println("已經被睡眠60s了");
if (Thread.interrupted()) {
System.out.println("執行緒被中斷過");
}
}
};
Thread t3=new Thread(r);
t3.setName("執行緒t3");
System.out.println("執行緒t3的名字為: "+t3.getName());
t3.start();
//中斷執行緒睡眠
t3.interrupt();
//終止執行緒
//通過布林標記的方式終止
MyRunnable rm=new MyRunnable();
Thread t4=new Thread(rm);
t3.setName("執行緒t4");
t3.start();
//主執行緒睡眠5秒
try {
Thread.sleep(100*5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rm.run=false;//終止t4執行緒
}
}
class MyRunnable implements Runnable{
boolean run=true;
@Override
public void run() {
// TODO Auto-generated method stub
if (run) {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "--->" + i);
}
}else {
//save
return;
}
}
}
什麼時候開始搶奪時間片呢
start()之後,run()之前。
相關文章
- 多執行緒基礎知識點梳理執行緒
- 多執行緒程式設計基礎知識執行緒程式設計
- java多執行緒基礎知識速通Java執行緒
- 多執行緒基礎必要知識點!看了學習多執行緒事半功倍執行緒
- 多執行緒面試必備基礎知識彙總執行緒面試
- Java基礎知識回顧之五 ----- 多執行緒Java執行緒
- 多執行緒程式設計的基礎知識點執行緒程式設計
- Android 基礎知識——執行緒Android執行緒
- Android小知識-Java多執行緒的基礎知識瞭解下AndroidJava執行緒
- Java多執行緒程式設計基礎知識彙總Java執行緒程式設計
- 執行緒的基礎知識(轉載)執行緒
- 多執行緒系列(1),多執行緒基礎執行緒
- 多執行緒系列(二):多執行緒基礎執行緒
- 多執行緒基礎執行緒
- JAVA基礎知識系列---程式、執行緒安全Java執行緒
- JAVA基礎知識系列—程式、執行緒安全Java執行緒
- 多執行緒學習一(多執行緒基礎)執行緒
- java - 多執行緒基礎Java執行緒
- Java—多執行緒基礎Java執行緒
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- 多執行緒系列(三):執行緒池基礎執行緒
- 多執行緒基礎-基礎實現執行緒
- Java多執行緒相關知識Java執行緒
- Java 多執行緒基礎(八)執行緒讓步Java執行緒
- 多執行緒基礎入門執行緒
- Java 多執行緒基礎 - CyclicBarrierJava執行緒
- Java多執行緒-基礎篇Java執行緒
- pthread 多執行緒基礎thread執行緒
- 基礎鞏固 --多執行緒執行緒
- python多執行緒基礎Python執行緒
- 多執行緒之初識執行緒執行緒
- C#多執行緒開發-執行緒基礎 01C#執行緒
- 《面試補習》- 多執行緒知識梳理面試執行緒
- 關於 iOS/OS X 執行緒安全的基礎知識iOS執行緒
- 多執行緒(三)、執行緒池 ThreadPoolExecutor 知識點總結執行緒thread
- C++多執行緒基礎教程C++執行緒
- 併發與多執行緒基礎執行緒
- JAVA_基礎多執行緒(一)Java執行緒