關于多線程的介紹
一、進程與線程
1.進程:
進程是操作系統中一種非常重要的軟件資源,當我們把一個可執行程序exe運行起來的時候,系統就會隨之創建一個進程,如果這個程序結束系統會隨之銷毀對應的進程。
當運行exe文件時,exe文件中的很多內容都加載到內存中,通過分配資源來執行這個程序包含的指令的過程叫做進程。
2.線程:
線程其實是一種輕量級的進程,一個進程中包含多個線程,每個線程都有一段自己的執行邏輯,每個線程都是一個獨立的執行流。
3.進程與線程的區別:
進程是操作系統分配資源的最小單位,線程是任務調動和執行的最小單位
一個操作系統中可以運行多個進程,一個進程中有多個線程同時執行
系統在運行時會為每個進程分配內存,系統不會單獨為每個線程分配內存
創建進程時系統會自動創建一個主線程由主線程完成,進程中有多線程時,由多線程共同執行完成
二、多線程的作用
1.多線程的作用:
可以解決負載均衡問題,充分利用CPU的資源,為了提高Cpu的使用,采用多線程的方法去同時完成幾件事情而互不干擾
2.使用場景:
大多數的情況下, 使用多線程 主要是需要處理大量的IO操作或處理的情況需要花大量的時間等
3.用戶體驗
揮多核處理器的優勢,并發執行讓系統運行的更快、更流暢,用戶體驗更好
三、多線程的實現
1. java實現
(1)創建一個繼承于Thread類的子類
(2)重寫Thread類的run() --> 將此線程執行的操作聲明在run()中
(3)創建Thread類的子類的對象
(3)通過此對象調用start()
package TestJava.Advanced;
//第一步:繼承Thread
public class ThreadDemo extends Thread {
//票數
private static Integer ticketNums = 0;
@Override
//第二步:重寫run方法
public void run(){
for (int i = 0; i < 1000; i++) {
System.out.println("當前正在運行子線程---第"+i+"次");
}
}
public static void main(String[] args){
//第三步:創建一個線程對象
ThreadDemo threadDemo = new ThreadDemo();
//第四步:調用start()啟動線程
threadDemo.start();
for (int i = 0; i < 1000; i++) {
System.out.println("正在運行主線程---第"+i+"次");
}
}
}
查看運行的結果,主線程與子線程并行執行:

2. python實現
1)定義線程方法
def thread_1():
def thread_2():
2)定義線程
thread1 = threading.Thread(target = thread_1)
thread2 = threading.Thread(target = thread_2)
3)啟動線程
thread1.start()
thread2.start()
4)等待線程執行完畢
thread1.join()
thread2.join()
5)具體的代碼實現
import datetime
import threading
import time
import requests
start_time = datetime.datetime.now()
print("開始時間:",start_time)
def thread_1():
start1_time = datetime.datetime.now()
print("線程1開始時間:", start1_time)
url = "http://192.168.37.8:7777/api/mytest2"
data1 = requests.post(url).text
#print(data1)
time.sleep(2)
end1_time = datetime.datetime.now()
print("線程1結束時間", end1_time)
def thread_2():
start2_time = datetime.datetime.now()
print("線程2開始時間:", start2_time)
url2 = "http://192.168.37.8:7777/api/mytest"
data2 = requests.get(url2).text
#print(data2)
time.sleep(2)
end2_time = datetime.datetime.now()
print("線程2結束時間", end2_time)
thread1 = threading.Thread(target = thread_1)
thread2 = threading.Thread(target = thread_2)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
end_time = datetime.datetime.now()
print("結束時間",end_time)
time_need = (end_time - start_time ).seconds
print("耗時豪秒數:",time_need)
查看程序的運行:

3.golang實現
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world")
say("hello")
}
查看運行結果:

四、不同語言多線程使用中的區別:
1.python:
在Python中,可以使用多線程,但不要指望能有效利用多核。如果一定要通過多線程利用多核,那只能通過C擴展來實現,不過這樣就失去了Python簡單易用的特點
2.java:
重寫run方法:使用繼承方式的好處是,在run()方法內獲取當前線程直接使用this就可以了,無須使用Thread.currentThread()方法;不好的地方是Java不支持多繼承,如果繼承了Thread類,那么就不能再繼承其他類。另外任務與代碼沒有分離,當多個線程執行一樣的任務時需要多份任務代碼,而實現run方法:解決繼承Thread的缺點,沒有返回值
3.c#
一個進程可以創建一個或多個線程以執行與該進程關聯的部分程序代碼。在C#中,線程是使用Thread類處理的,該類在System.Threading命名空間中。使用Thread類創建線程時,只需要提供線程入口,線程入口告訴程序讓這個線程做什么

浙公網安備 33010602011771號