程序與執行緒,執行緒的兩種建立方式
阿新 • • 發佈:2019-01-08
程式:一條一條的按照語法規則排列起來的指令序列,告訴計算機完成一連串的操作,程式預設的是儲存在硬碟上的;
當程式開始執行的時候,OS(作業系統)要把程式裝入記憶體,然後CPU從記憶體中一條一條的讀取並執行指令;
當一個程式被裝入記憶體,正在執行的時候,這時這個程式就被稱為一個程序(正在進行的程式);
OS(作業系統)是如何做到多程序同時執行的呢?
作業系統把時間單位平均分成若干小份,每一個小份稱為一個時間片,作業系統在不同時間片裡去執行不同程序的指令,如上圖在時間片中執行A程序或B程序;
作業系統是如何做到多執行緒同時執行的呢?也是通過時間片的形式,把程序的時間片分為更小的時間片。
在一個程序中同時執行的多個操作稱為執行緒。
程序和執行緒的區別:
1 . 每個程序都有各自獨立的記憶體空間,而執行緒沒有獨立的記憶體空間;
2 . 執行緒必須要執行在程序之內,換句話說沒有程序,就不會有執行緒;
3 . 執行緒可以共享程序的記憶體空間;
執行緒是程式中的執行程式。Java虛擬機器允許應用程式併發地執行多個執行執行緒。
建立新執行行程有兩種方法。一種方法是將類宣告為 Thread 的子類。該子類應重寫 Thread 類的 run 方法。接下來可以分配並啟動該子類的例項。
任意一個專案
main方法:
public class Main { public static void main(String[] args) { // 我們這段程式中包含了三個執行緒,第一個是主執行緒.主執行緒是JVM啟動的時候建立的 // 並且在主執行緒中呼叫類main方法.程式執行的時候,主執行緒處於正在執行狀態.這樣的話才能執行main方法 // 建立執行緒物件 Thread1 t1 = new Thread1("小黑執行緒"); Thread2 t2 = new Thread2("小紅執行緒"); // 啟動執行緒的時候要呼叫執行緒的start()方法.執行緒啟動之後,會自動的執行執行緒體 // 這樣的話,兩個執行緒會交替執行 t1.start(); t2.start(); // 而不能直接呼叫執行緒的run()方法.這樣兩個執行緒會失去併發性.一個執行完另一個再執行 // t1.run(); // t2.run(); // 我們也可以讓主執行緒執行某些操作 // 主執行緒和我們自己建立的執行緒一樣,也就是一個執行緒而已.只不過這個執行緒是JVM啟動的時候由JVM建立的 for (int i = 1; i <= 500000; i++) { System.err.println("主執行緒在計數:i=======" + i); } } }
執行緒1:
public class Thread1 extends Thread {
public Thread1(String name) {
super(name);
}
// 我們把執行緒要執行的操作寫在run方法中
// run()方法又被稱為執行緒體
public void run() {
for (int i = 1; i <= 500000; i++) {
System.out.println(this.getName() + "在計數:i=" + i);
}
}
}
執行緒2:
public class Thread2 extends Thread { public Thread2(String name){ super(name); } // 我們把執行緒要執行的操作寫在run方法中 // run()方法又被稱為執行緒體 public void run() { for (int i = 1; i <= 500000; i++) { System.err.println( this.getName() +"在計數:i=" + i); } } }
建立執行緒的另一種方法是聲名實現 Runnable 介面的類。該類然後實現 run 方法。然後可以分配該類的例項,在建立 Thread 時作為一個引數來傳遞並啟動。
任意一個專案
main方法:
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// 建立兩個目標物件
Runnable tar1 = new Target1();
Runnable tar2 = new Target2();
// 建立執行緒物件,並讓執行緒物件來執行指定的目標物件
Thread t1 = new Thread(tar1, "小黑執行緒"); // t1執行緒來執行目標1,t1執行緒的名字叫 小黑執行緒
Thread t2 = new Thread(tar2, "小紅執行緒");
// 啟動執行緒.執行緒啟動之後會自動的執行目標物件
t1.start();
t2.start();
}
}
執行緒1:
// 我們把實現Runnable介面的類稱為目標物件,也就是專門用來給執行緒執行的
public class Target1 implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 500000; i++) {
// 目標物件是專門來給執行緒物件執行的
// 我們需要在目標中獲取正在執行該目標的執行緒物件: Thread.currentThread();
System.out.println(Thread.currentThread().getName() + "正在工作, 小黑目標在計數:i=" + i);
}
}
}
執行緒2:public class Target2 implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 500000; i++) {
System.err.println(Thread.currentThread().getName() + "正在工作,小紅目標在計數:i=" + i);
}
}
}
希望對你有幫助,祝你有一個好心情,加油!
若有錯誤、不全、可優化的點,歡迎糾正與補充;轉載請註明出處!