目錄
1.什么是進程
1.1進程控制塊抽象
1.2 CPU 分配 —— 進程調度(Process Scheduling)
1.3內存分配 —— 內存管理(Memory Manage)
1.4進程間通信(Inter Process Communication)
2.線程
?2.1概念
2.2為什么要有線程
2.3線程和進程的區別
2.4 Java線程和操作系統線程的關系
3.使用Java代碼來實現多線程程序
3.1.繼承Thread類來實現
3.2實現Runnalbe接口
3.3匿名內部類創建Thread子類對象
3.4匿名內部類創建Runnable類對象
3.5?多線程的優勢-增加運行速度
1.什么是進程
? 每個應用程序運行于現代操作系統上的時候,操作系統會提供一種抽象,好像系統上只有這個程序在運行,所有的硬件資源都是這個程序在使用。這種假象是通過抽象了一個進程的概念來完成的,進程可以說是計算機科學最重要和最成功的概念之一。
進程是操作系統對一個正在運行的程序的一種抽象,換言之,可以把進程看做程序的一次運行過程;同時,在操作系統內部,進程又是操作系統進行資源分配的基本單位.
1.1進程控制塊抽象
? ?計算機內部要管理任何現實事物,都需要將其抽象成一組有關聯的、互為一體的數據。在 Java 語言中,我們可以通過類/對象來描述這一特征.
// 以下代碼是 Java 代碼的偽碼形式,重在說明,無法直接運行
class PCB {
// 進程的唯一標識 —— pid;
// 進程關聯的程序信息,例如哪個程序,加載到內存中的區域等
// 分配給該資源使用的各個資源
// 進度調度信息
}
? ? 這樣,每一個 PCB 對象,就代表著一個實實在在運行著的程序,也就是進程。
操作系統再通過這種數據結構,例如線性表、搜索樹等將 PCB 對象組織起來,方便管理時進行增刪查改的操作.
1.2 CPU 分配 —— 進程調度(Process Scheduling)
? 為了便于討論和理解,我們大部分的場景下假設是單CPU單核的計算機。
操作系統對CPU資源的分配,采用的是時間模式 —— 不同的進程在不同的時間段去使用 CPU 資源。
1.3內存分配 —— 內存管理(Memory Manage)
? 操作系統對內存資源的分配,采用的是空間模式 —— 不同進程使用內存中的不同區域,互相之間不會干擾。
?
1.4進程間通信(Inter Process Communication)
? ?如上所述,進程是操作系統進行資源分配的最小單位,這意味著各個進程互相之間是無法感受到對方存在的,這就是操作系統抽象出進程這一概念的初衷,這樣便帶來了進程之間互相具備”隔離性
? (Isolation)“。
? 但現代的應用,要完成一個復雜的業務需求,往往無法通過一個進程獨立完成,總是需要進程和進程進行配合地達到應用的目的,如此,進程之間就需要有進行“信息交換“的需求。進程間通信的需求就應運而生。
目前,主流操作系統提供的進程通信機制有如下:
1. 管道
2. 共享內存
3. 文件
4. 網絡
5. 信號量
6. 信號
?其中,網絡是一種相對特殊的 IPC 機制,它除了支持同主機兩個進程間通信,還支持同一網絡內部非同一主機上的進程間進行通信.
?
2.線程
?2.1概念
一個線程就是一個'執行流',每個線程之間都可以按照順序執行自己的代碼,多個線程之間'同時'執行著多份代碼
舉個例子,比如我現在要去搬家,我一個人忙不過來,喊了張三和李四一起來.然后我們三個人一人負責一件事,我負責搬家電,張三負責開車,李四負責收拾.但是本質上我們三個人是辦的搬家這一件事.
?此時我們就可以把這種情況稱為多線程,將一個大任務分解成不同的小任務,交給不同執行流分別執行,其中張三和李四是我叫來的,所以我一般被稱為主線程.
2.2為什么要有線程
?
2.3線程和進程的區別

2.4 Java線程和操作系統線程的關系
線程是操作系統中的概念. 操作系統內核實現了線程這樣的機制, 并且對用戶層提供了一些 API 供用戶使用(例如 Linux 的 pthread 庫).
Java 標準庫中 Thread 類可以視為是對操作系統提供的 API 進行了進一步的抽象和封裝
3.使用Java代碼來實現多線程程序
3.1.繼承Thread類來實現
package demo;class MyThread extends Thread{@Overridepublic void run() {while (true){System.out.println("這是線程運行的代碼");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class Test {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start();while (true){System.out.println("main函數");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
使用Javabin自帶的jconsole來觀察線程
?上圖是一個main線程
3.2實現Runnalbe接口
package demo1;
class MyThread implements Runnable{@Overridepublic void run() {System.out.println("Runable");}
}public class Test {public static void main(String[] args) {Thread myThread = new Thread(new MyThread());myThread.start();}
}
3.3匿名內部類創建Thread子類對象
package demo2;public class Test {public static void main(String[] args) {Thread thread = new Thread(){@Overridepublic void run() {System.out.println("匿名內部類創建子類對象");}};}
}
3.4匿名內部類創建Runnable類對象
package demo3;public class Test {public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("匿名內部類創建Runnable類對象");}};}
}
3.5lambda表達式創建Runnable子類對象
package demo4;public class Test {public static void main(String[] args) {Thread runnable = new Thread(() -> {System.out.println("hello");});}
}
3.5?多線程的優勢-增加運行速度
可以觀察多線程在一些場合下是可以提高程序的整體運行效率的。
使用 System.nanoTime() 可以記錄當前系統的 納秒 級時間戳.
serial 串行的完成一系列運算. concurrency 使用兩個線程并行的完成同樣的運算.
?