关于多线程的介绍

一、进程与线程

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实现

Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。
goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。
语句:go f(x, y, z)
如:开启一个新的 goroutine:
f(x, y, z)
具体的实现如下:
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类创建线程时,只需要提供线程入口,线程入口告诉程序让这个线程做什么

 

posted @ 2024-02-15 16:52  Mrwhite86  阅读(42)  评论(0编辑  收藏  举报