java多執行緒—執行緒的基本介紹
阿新 • • 發佈:2019-01-30
程序和執行緒:
程序是程式的一次動態執行過程,經歷了從程式碼的載入、執行到執行完畢的一個完整的過程,這個過程也是程序本身從產生、發展到最終消亡的過程。
多執行緒是實現併發機制的一種有效手段。程序和執行緒一樣,都是實現併發的一個基本單位。
java實現多執行緒:
·繼承Thread類
·實現Runnable介面
繼承Thread類:(java.lang)
多執行緒操作類:繼承了Thread類的類,必須明確的覆寫Thread類中的run()方法,次方法為執行緒的主體。
多執行緒的定義語法:
class 類名稱 extends Thread{
屬性;
方法;
//覆寫Thread類中的run()方法,此方法是執行緒的主體
public void run(){
執行緒的主體;
}
}
啟動執行緒:start() 方法-->最終呼叫的還是run()
檢視java.lang.Thread類,找到start()方法:
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
private native void start0();
start()會丟擲異常
native關鍵字表示由java呼叫本機作業系統函式的一個關鍵字。在java中,執行JAVA程式呼叫本機的作業系統的函式以完成特定功能。
想要實現多執行緒操作,需要作業系統的支援,因為多執行緒會搶佔CPU資源,等待CPU排程,這一點需要作業系統的底層支援,所以用native關鍵字呼叫本機系統函式。而在不同的作業系統中多執行緒的實現底層程式碼肯定是不同的,所以用native關鍵字讓JVM去調整不同的JVM來實現。
Runnable介面:
在java中也可以通過實現Runnable介面的方式實現多執行緒,Runnable介面中只定義了一個抽象方法:
public void run();
通過Runnable介面實現多執行緒:
class類名稱 implements Runnable{
屬性;
方法;
public void run(){
執行緒主體;
}
}
在Runnable介面中沒有sttart()方法,可以通過例項化Thread類物件實現:
class MyThread implements Runnable
{
private String name; //定義執行緒名稱
public MyThread(String name){
this.name=name;
}
public void run(){
for(int i=0;i<10;i++){
System.out.println(name+"執行,i="+i);
}
}
}
public class RunnableDemo
{
public static void main(String args[]){
MyThread mt1 = new MyThread("執行緒A"); //例項化物件
MyThread mt2 = new MyThread("執行緒B");
Thread t1 = new Thread(mt1); //例項化Thread類物件
Thread t2 = new Thread(mt2);
t1.start();
t2.start(); //啟動多執行緒
}
}
Thread類與Runnable介面的關係
Thread類定義:
從以上定義格式可以發現,Thread類也是Runnable介面的子類。
Thread類與Runnable介面的區別 使用Thread類操作多執行緒,無法達到資源共享 Runnable介面可以實現資源共享
使用Thread類實現:
class MyThread extends Thread { private int ticket = 5; //總共5張票 public void run(){ for(int i=0;i<100;i++){ if(this.ticket>0){ System.out.println("賣票:ticket="+ticket--); } } } } public class RunnableDemo { public static void main(String args[]){ MyThread mt1 = new MyThread(); MyThread mt2 = new MyThread(); MyThread mt3 = new MyThread(); mt1.run(); mt2.run(); mt3.run(); } }
程式執行結果:
3個程序各自賣自己的5張票
使用Runnable介面實現
class MyThread implements Runnable { private int ticket = 5; //總共5張票 public void run(){ for(int i=0;i<100;i++){ if(this.ticket>0){ System.out.println("賣票:ticket="+ticket--); } } } } public class RunnableDemo { public static void main(String args[]){ MyThread mt = new MyThread(); MyThread mt1 = new MyThread(); new Thread(mt,"售票口一").start(); //呼叫執行緒主體 new Thread(mt,"售票口二").start(); } }
執行結果:
兩個串列埠同事賣5張票。
多執行緒的執行緒狀態:
建立狀態:準備好了一個多執行緒物件: Thread t = new Thread()就緒狀態:呼叫了start()方法,等待CPU呼叫執行狀態:執行Run()方法阻塞狀態:暫時停止執行,可以將資源交給其他執行緒使用終止狀態:執行緒執行完畢了,不再使用
public class Thread
extends Objectimplements Runnable從以上定義格式可以發現,Thread類也是Runnable介面的子類。
Thread類與Runnable介面的區別 使用Thread類操作多執行緒,無法達到資源共享 Runnable介面可以實現資源共享
使用Thread類實現:
class MyThread extends Thread { private int ticket = 5; //總共5張票 public void run(){ for(int i=0;i<100;i++){ if(this.ticket>0){ System.out.println("賣票:ticket="+ticket--); } } } } public class RunnableDemo { public static void main(String args[]){ MyThread mt1 = new MyThread(); MyThread mt2 = new MyThread(); MyThread mt3 = new MyThread(); mt1.run(); mt2.run(); mt3.run(); } }
程式執行結果:
3個程序各自賣自己的5張票
使用Runnable介面實現
class MyThread implements Runnable { private int ticket = 5; //總共5張票 public void run(){ for(int i=0;i<100;i++){ if(this.ticket>0){ System.out.println("賣票:ticket="+ticket--); } } } } public class RunnableDemo { public static void main(String args[]){ MyThread mt = new MyThread(); MyThread mt1 = new MyThread(); new Thread(mt,"售票口一").start(); //呼叫執行緒主體 new Thread(mt,"售票口二").start(); } }
執行結果:
兩個串列埠同事賣5張票。
多執行緒的執行緒狀態:
建立狀態:準備好了一個多執行緒物件: Thread t = new Thread()就緒狀態:呼叫了start()方法,等待CPU呼叫執行狀態:執行Run()方法阻塞狀態:暫時停止執行,可以將資源交給其他執行緒使用終止狀態:執行緒執行完畢了,不再使用