首页 > 其他分享 >关于多线程的介绍

关于多线程的介绍

时间:2024-02-15 17:01:21浏览次数:28  
标签:Thread 介绍 datetime start 线程 关于 time 多线程

一、进程与线程

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类创建线程时,只需要提供线程入口,线程入口告诉程序让这个线程做什么

 

标签:Thread,介绍,datetime,start,线程,关于,time,多线程
From: https://www.cnblogs.com/mrwhite2020/p/16978000.html

相关文章

  • Lag-Llama:第一个时间序列预测的开源基础模型介绍和性能测试
    2023年10月,我们发表了一篇关于TimeGPT的文章,TimeGPT是时间序列预测的第一个基础模型之一,具有零样本推理、异常检测和共形预测能力。虽然TimeGPT是一个专有模型,只能通过API访问。但是它还是引发了对时间序列基础模型的更多研究。到了2024年2月,已经有了一个用于时间序列预测的开源......
  • C++多线程 第五章 C++内存模型和原子类型
    第五章C++内存模型和原子类型无论其他语言如何,C++是一门系统编程语言.委员会希望不再需要一个比C++低级的语言.内存模型基础C++程序中所有的数据均是由对象(object)组成的.C++标准定义对象为"存储区域",经管它会为这些对象分配属于它们的类型和生存期.无论什么类型,对象......
  • 微信小程序页面跳转:wx.switchTab、wx.reLaunch、wx.redirectTo、wx.navigateTo、wx.na
    引言在微信小程序开发中,页面跳转是一项基础且常用的功能。本文将介绍微信小程序中五种常见的页面跳转方式,并分析它们的使用场景和区别。1.wx.switchTab(跳转主页)wx.switchTab方法用于跳转到tabBar页面,并关闭其他所有非tabBar页面,通常用于跳转到小程序的主页。特点:关闭......
  • 【学习笔记】关于图论的一切
    存图邻接矩阵边集邻接表最小生成树primkruskal最短路dij堆优化spfafloyd欧拉路欧拉回路scc缩点2-sAT二分图基础概念匈牙利DAG最小链覆盖网络流Dinic最小割最大权闭合子图最小割集费用流Zkw双连通问题割边割点双连通分量圆方树生成树计数......
  • 关于extern和模块化编程全局变量、函数、对象不同源文件之间的使用说明
    extern的使用在C语言中,extern关键字用于在多个源文件之间声明全局变量、函数或对象,实现模块间的交互和数据共享。即告诉编译器该变量或函数是在其他源文件中定义的,并且可以在当前源文件中使用。而局部函数的作用域限定在其定义所在的作用域内,无法被其他源文件直接访问或调用。因......
  • sbt介绍
    sbt是 Scala 的默认构建工具,它是一种基于命令行的构建工具,通过使用build.sbt文件来配置项目的构建和依赖管理。sbt提供了丰富的功能,可以方便地进行编译、运行、测试和打包等操作。它使用sbt语言来定义项目的配置,这种语言是一种DSL(领域特定语言),具有在构建过程中非常方便的......
  • 06-可编辑多边形-边界层级操作介绍
    1点击这个正方体(元素,快捷键为5,不是F5)2如果选择的是边界,则框选不到任何东西。选择一个面后按delete进行删除,就变成一个空心的状态了。3边界-挤出。4这是我自己进行操作的结果。5选中这条边之后,可见点击1处,然后会弹出3处的样子,进行设置,可以对边界的形状进行设置。6......
  • 关于“博客园”经济脱困的一些看法
    作为和CSDN同为中国IT领域最大的技术博客网站,一个赚的盆满钵满,一个到了穷的要关门大吉了,这个发展也是耐人寻味的。不得不说,之所以自己选择在博客园而不是CSDN,其主要原因就是没有那些讨厌的广告,使用起来十分简洁和方便。但是这个博客园发展到如今这个难以维继的局面也是没有预料到......
  • 【运维测试】移动测试自动化知识总结第1篇:移动端测试介绍(代码笔记已分享)
    本系列文章md笔记(已分享)主要讨论移动测试相关知识。主要知识点包括:移动测试分类及android环境搭建,adb常用命令,appium环境搭建及使用,pytest框架学习,PO模式,数据驱动,Allure报告,Jenkins持续集成。掌握操作app的基本api,掌握元素定位及获取元素信息的api,掌握事件操作api,掌握app模拟手势......
  • Linux-机械硬盘信息介绍
    ......