程序:一條一條的按照語法規則排列起來的指令序列,告訴計算機完成一連串的操作,程序默認的是保存在硬盤上的;
當程序開始執行的時候,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); } }}希望對你有幫助,祝你有一個好心情,加油!
若有錯誤、不全、可優化的點,歡迎糾正與補充;轉載請注明出處!
新聞熱點
疑難解答