多线程5

PyQt5自学记录(1)——PyQt5多线程实现详解 PyQt5实现多线程 阅读详情

阻塞队列

class MyBlockingQueue{
    private String[]elems=null;
    private volatile int head=0;
    private volatile int size=0;
    private volatile  int tail=0;
    public MyBlockingQueue(int capacity){
        elems=new String[capacity];
    }
    void put(String elem) throws InterruptedException {
        synchronized (this) {
            if (size >= elems.length) {
                this.wait();
                return;
            }
            elems[tail] = elem;
            tail++;
            if (tail >= elem.length()) {
                tail = 0;
            }
            size++;
            this.notify();
        }
    }
    String take() throws InterruptedException {
        synchronized (this) {
            if (size ==0) {
                this.wait();

            }
            String result= elems[head];
            head++;
            if (head >= elems.length) {
                head = 0;
            }
            size--;
        this.notify();
        return result;
    }
}
public class Demo1 {
    public static void main(String[] args) {

    }
}

wait不仅仅会被notify和notifyAll唤醒也可能被其他的操作唤醒比如interrupt。

优化再用wait方法的时候,应该搭配while判断条件的方式。这样的话就可以在被唤醒的时候再次确认,条件是否能再次成立,防止他覆盖到原来的哪些元素,当然这里的while循环对资源的调度是很小的,所以在执行了很多次以后就会忽略,防止了循环过多次而造成的死循环。

当然wait也是可以被interrupt打断的。

线程池

并发编程,一般会使用多进程,但是如果进程的任务很小,那么就会频繁的创建和销毁线程,这样就会消耗很多资源,这样就会降低效率。

直接创建/销毁线程,是需要用户态+内核态配合完成的工作。

线程池/协程,创建销毁,只通过用户态即可,不需要内核态的配合。如果使用线程池,提前把线程都创建好,放到用户态代码中写的数据结构里面后面用的时候,随时从池子里取,用完了放回池子里去这个过程,完全是用户态代码,不需要和内核进行交互。这将大大提高效率。

为什么调用内核态会大大降低效率呢?

是由于内核态不止会只有线程创建与销毁的任务,他还有其他的任务,但是任务的优先级都是大同小异的,所以一般线程的任务会等待,导致效率的降低。

  核心线程数

int corePoolSize

最大线程数

int maximumPoolSize

最大线程数=核心线程数+非核心线程数。

动态扩展一个线程池,刚被创建出来的时候,里面就包含核心线程数这么多的线程,

此时,线程池里就是包含4个线程线程池会提供一个submit方法,往里面添加任务.每个任务都是一个Runnable对象,如果当前添加的任务比较少,4个线程就足以能够处理,就只有4个线程在工作了,如果添加的任务比较多,4个线程处理不过来了.(有很多的任务在排队等待执行)这个时候,线程池就会自动创建出新的线程,来支撑更多的任务创建出来的线程总数,不能超过最大线程数过了一段时间之后,任务没那么多了,线程清闲了,部分线程就会被释放掉(回收了)回收只是把非核心线程回收掉,至少会保证线程池中线程数目不少于核心线程数。

就像公司招聘,如果公司压力大,那么就会招实习生,但是压力小的时候,就会辞退临时工。

线程数的设置,是根据具体情况来定的。但是大体可以分为两大类:

1.cpu密集型程序.

你的代码完成的逻辑,都是要通过cpu干活来完成的.

public class Demo2 {
    Thread thread=new Thread(()->{
        int count=0;
        for(int i=0;i<10000;i++){
            count++;
            System.out.println(count);
        }
    });

}

 这样的代码就会使cpu疯狂工作。

2.IO密集型程序.

你的代码大部分时间在等待IO(等待IO是不消耗CPU,不参与调度)

 Thread thread1=new Thread(()->{
        Scanner scanner=new Scanner(System.in);
        while (true){
            int a=scanner.nextInt();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    });

协程(纤程)和线程池的功能是相同的,但是方法的实现方式不同。

非核心线程,孕育最大空闲时间, 时间单位(s,min,h,ms).

long keepAliveTime  ,TimeUnit unit

非核心线程,在线程池不忙的时候,就会回收。

线程池的任务队列

BlockingQueue<Runnable> workQueue

是一个阻塞队列, 它可以用来存放任务。常用的实现类有`LinkedBlockingQueue`()、`ArrayBlockingQueue(数组)

工厂模式

不再使用构造方法创建对象给构造方法包装一层

  ThreadFactory threadFactory

这个线程工厂,主要是为了批量的给要创建的线程设置一些属性啥的线程工厂,在它工厂方法中,把线程的属性提前初始化好了,主要是解决,基于构造方法创建对象太坑了的问题,

当出现重载无法表示的问题的时候,就像

 public void zuobiao(int a,int b){
        
    }
    public void zuobiao(int r,int a){

    }

这样用笛卡尔坐标系和极坐标系的方式,这样的话就会造成重载(构造方法名字固定,类型和变量多少不一定)无法表示的方法这时候就需要用到工厂方法,虽然工厂方法不常用。

    public static A makexy(int x,int y){
        A a=new A();
        a.setX();
        a.setY();
        return a;
    }
    public static A makera(int r,int a){
        A a=new A();
        a.setr();
        a.seta();
        return a;
    }

        异常处理方式

RejectedExecutionHandler handler
 1.ThreadPoolExecutor.AbortPolicy,

直接抛出异常.(让程序猿快速的知道,任务处理不过来了,代码罢工了)

2.ThreadPoolExecutor.CallerRunsPolicy,

你给我这个线程池添加任务,不好意思,我这满了,你自己来执行谁负责添加任务,谁负责执行任务.线程池本身,不管了.

submit内部要做的事情不仅仅是入队列如果发现,队列满&&当前使用的这个拒绝策略,就会在submit内部自己去执行Runnable的run方法

3.ThreadPoolExecutor.DiscardoldestPolicy,

丢弃掉最老的任务.让新的任务去队列中排队

任务队列中队首的元素舍弃掉

4.ThreadPoolExecutor.DiscardPolicy

丢弃最新的任务,还是按照原有的节奏来执行

正在submit这个任务就不要了.

PyQt5多线程全面系统地学习 定义:多线程是在单个进程内运行多个线程,每个线程可以执行不同的任务。线程是操作系统调度的基本单位。共享内存空间:线程共享同一个进程的内存空间,因此可以轻松地共享数据,但这也带来了线程安全的问题。轻量级:线程比进程更轻量级,创建和销毁的开销较小。适用场景:适用于I/O密集型任务,如文件读写、网络请求等,因为这些任务往往在等待I/O操作完成时会阻塞线程,但其他线程可以继续执行。线程:使用创建和管理线程,适用于I/O密集型任务。使用LockEvent等工具进行线程同步和通信。QRunnable。 阅读详情

相关推荐

pyqt5 多线程遇到的问题总结

前言     在使用pyqt5时,程序运行时间过长可能会造成界面假死的情况,为了解决这个问题,可以采用多线程。将程序放到子线程中运行。     这里pyqt5 多线程用的方法是继承Qthead类,然后重写run()函数实现。 # 多线程的实现 class MyThread(QThread): _signal = pyqtSignal(object) # 自定义信号,用于传递数据等 def __init__(self): super().__init__()

来一打雪碧 6368

PyQT5 多线程 QThread

PyQT5 多线程 在常规的界面软件中,需要将UI线程和工作线程加以区分,主要原因是某些工作线程很复杂且耗时,比如下载某个文件或者长时间的计算,当执行这些进程时,UI主进程会被阻塞,界面会出现未响应的状态,所以需要用到多线程来解决这个问题。 QThread QThread是QT线程类中最核心的底层类。由于PyQt的跨平台特性,QThread要隐藏所有与平台相关的代码,可以先创建它的子类,然后覆盖本身所有的QThread.run()函数。 import time from PyQt5.QtCore impor

Persus & Xie 1万+

Python-PyQt5-多线程测试

前言 努力是为了让你的目标更明确,但方向若错了,那可能就成了最遗憾的意外了 今天学习一下Python里的多线程的应用。但大家要清楚什么是线程,什么是进程,要区分二者概念 1 概念 什么是线程? 线程是一个轻量级的子进程,是最小的处理单元。可以说线程是进程的子集。 线程是独立的,一个线程发生错误,不影响其他线程正常执行。 什么是进程? 进程是指正在运行中的应用程序。每个进程都有自己独立的内存空间...

Funny 4065

PyQt5和Python的多线程

简介 Python程序本身没有真正意义的并发多线程,受制于GIL锁。如果实现真正的多线程,需要借助于多进程实现,类Unix平台都提供了fork系统调用,但是Windows平台很难实现多进程。 多进程消耗资源比较大,有些情况下,一些轻量级的任务需要借助多进程,比如高I/O、轻计算的任务。threading库是Python封装的高级线程库。但是,如果是使用PyQt5的UI情况下,更建议使用QThrea...

Erick Lv的笔记 3821

Python PyQt5 多线程

直接上代码,看不懂的可以留言: # -*- coding: utf-8 -*- from PyQt5.QtWidgets import QWidget, QApplication, QPushButton from PyQt5.QtCore import QThread, pyqtSignal import sys class WorkThread(QThread): sinOut...

Rain And Sea 887

PyQt5——多线程、信号与槽

多线程、信号与槽之间经常在一起使用,单独的知识在之前的博客中详细介绍过了:https://blog.youkuaiyun.com/qq_41895747 今天聊一聊结合在一起使用 先看代码 # ——创建时间2019.2.18———— # 多线程、信号与槽 from PyQt5.QtWidgets import * from PyQt5.QtCore import * import sys clas...

沉迷单车的追风少年 1943

PYQT5实现多线程的方法

pyqt5处理多线程主要有三种方法: a.使用计时器模块QTimer b.使用多线程模块QThread c.使用事件处理功能 QTimer相当于一个定时器,每当定时器时间溢出后,会执行相关的函数。这个时候程序会从主线程界面跳到QTimer函数中,如果QTimer函数中有延时或者处理时间较长,就会出现界面失去响应,造成界面卡顿的现象。 QThread等于新开一个线程专门处理耗时间的程序,UI主线程显示界面,当子线程处理好数据后通过自定义的信号与槽,将数据交给主线程刷新界面。由于UI主线程一直运行,子线程的延时

GDUT_ZXM的博客 9114

提示词工程的几个参数

低 temperature + 低 top-p:输出最稳定、最可靠,适合需要准确性和一致性的场景。高 temperature + 高 top-p:输出最多样化、最富有创意,适合需要灵感和探索的场景。Max Length:您可以通过调整max length来控制大模型生成的 token 数。指定 Max Length 有助于防止大模型生成冗长或不相关的响应并控制成本。是一个字符串,可以阻止模型生成 token,指定是控制大模型响应长度和结构的另一种方法。例如,您可以通过添加 “11” 作为。

weixin_44212787的博客 1826

PyQt5 多线程运行

下面介绍如何实现PyQt5多线程运行的方法: 下面在第一个程序的基础上继续写: (1)导入依赖库 import sys from demo import Ui_MainWindow from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtCore import QThread 其中 Thread 是PyQ...

yansf 3079

INCA软件操作指南:手把手教你生成和解析DCM标定数据文件

本文详细介绍了INCA软件在汽车ECU开发中生成和解析DCM标定数据文件的全流程。从A2L文件导入到DCM文件生成,再到HEX文件导出,手把手教你掌握标定数据处理的实用技巧,包括参数标定、曲线标定和常见问题排查,帮助工程师提升工作效率。

weixin_29271053的博客 1052

嵌入式电机控制实战:手把手教你实现I/F强拖启动(附仿真代码)

本文详细介绍了嵌入式电机控制中的I/F强拖启动技术,通过参数配置、代码实现和仿真验证的完整流程,帮助开发者掌握永磁同步电机(PMSM)的高效启动方法。文章包含硬件平台搭建、参数整定黄金法则及MATLAB/Simulink仿真验证,适合工业自动化和智能设备领域的工程师参考。

rust6ferris的博客 911

详细学习PyQt5中的多线程

本节将探讨为何在PyQt5应用中采用多线程和并发编程是必要的,并引出接下来将要深入讨论的主题:多线程的基本概念、并发编程的需求以及如何与PyQt5框架集成。在这个场景中,使用多线程可以提高用户体验,保持应用的响应性。多线程和并发在图形用户界面应用程序中的应用是至关重要的,可以提高应用的性能、响应性和用户体验。在 PyQt5 应用中,异步编程和协程可以提高程序的效率,尤其是在处理涉及网络请求或其他 I/O 操作的任务时。在Python中,多线程是一种同时执行多个线程的机制,每个线程都是独立的执行流。

weixin_49520696的博客 7371

基于Simulink的电机轴电压与轴电流抑制仿真

本文带你完成了电机轴电压与轴电流抑制的Simulink仿真,实现了:✅ 揭示了共模电压 → 寄生电容 → 轴电压 → 轴承电蚀的完整链路✅ 搭建了含寄生参数的高频电机等效模型共模电压最小化PWM(源头抑制)dv/dt滤波器(路径阻断)轴接地(终端泄放) ✅ 通过仿真验证了轴电压从68 V降至<3 V的显著效果 ✅ 为高可靠性电机系统提供低成本、高效益的轴承保护方案。

amy_mhd的博客 163

PyQt5 多线程相关一些例子

PyQt5 多线程相关一些例子 demo1 from https://www.cnblogs.com/hhh5460/p/5175322.html from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QGridLayout from PyQt5.QtCore import QThread, QObject, pyqtSignal, ...

zhangji 2万+

Linux系统安装部署Redis完整教程(图文详解)

最近需要在Linux服务器安装部署Redis,参考了网上很多的文章,比较零碎,所以我自己写了一篇完整的Redis安装部署文档,在部署Redis之前重装了我的华为服务器,就是为了给大家一步步阐述我的操作过程,配合图文进行讲解更加通俗易懂!

黄团团的个人博客 6692

大数据领域存算分离:教育行业的数据应用探索

在当今数字化时代,教育行业积累了海量的数据,如学生的学习记录、考试成绩、在线学习行为等。如何高效地存储、管理和分析这些数据,以挖掘其潜在价值,为教育决策、教学改进和学生个性化发展提供支持,成为教育行业面临的重要挑战。大数据领域的存算分离技术为解决这一问题提供了新的思路和方法。本文旨在探索存算分离技术在教育行业的数据应用,分析其原理、优势和实际应用场景,为教育行业的数据管理和分析提供参考。本文共分为十个部分。第一部分介绍背景,包括目的和范围、预期读者、文档结构概述和术语表;

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 812

ue5 多线程

UE5 中的多线程功能允许开发者在应用程序中使用多个线程来提高性能。这可以帮助减少单个线程执行时间,从而提高应用程序的帧率。 UE5 提供了多种方法来创建和使用多线程,包括: FAsyncTask: 这是一种简单的方法,可以在后台线程中执行异步任务。 FThreadSafeCounter: 这是一种线程安全的计数器,可以在多个线程之间共享。 TQueue: 这是一种线程安全的队列,可以在多个线程...

weixin_42610010的博客 1215

大唐杯5G考前冲刺篇(回顾全文重点必看)

大唐杯习题复习指南

nimo观察者 1万+

6. PyQt5 中的多线程的使用(上)

这一节引入了多线程这个非常重要概念, 在我认为多线程的重要性是紧紧次于信号与槽函数的, 因为在平时经常使用 1. 为什么要用多线程 先看下面这一个示例代码 6.1 from form import Ui_Form from PyQt5.QtWidgets import * import sys import time class MyWin(QWidget,Ui_Form): """d...

Hello_wshuo 3万+

数据分析之AB测试基础知识

在 A/B 测试中,零假设是两组的指标是相同的,当假设检验推断出两组指标不同,但事实上两组指标相同时,就是第一类错误。

qq_45727498的博客 561

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Qt5多线程

推荐Qt5 多线程 步骤: 参考文献 Qt5教程 多线程

优秀本人 174

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

PyQt5多线程

多线程一般有两种办法: 继承QThread 继承QObject并使用movetothread(官方推荐) 使用第二种方法时,在线程结束后要执行以下两行代码: self.test_thread2.quit() self.test_thread2.wait() 如果不确保线程完全退出,线程再次运行时程序会崩溃。 效果图: 源码: import time from PyQt5...

llc的博客 2138

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

HTML5 多线程

在HTML5里面,提供了一个振奋人心的功能,在HTML终于原生支持多线程了,我们的用户再也不用看到那个提示脚本运行时间过长的提示框了,具体的实现也很简单,只需要在javascript里面创建一个worker,就可以启动一个线程,然后通过message的方式进行传值,基本代码如下 //创建一个线程 var worker = new Worker("js/work.js"); //发起一个消息给

杜仁栋的专栏 5288

用VC5实现多线程

用VC++5实现多线程 ----多任务、多进程和多线程 ----Windows95和WindowsNT操作系统支持多任务调度和处理,由此提供了多任务空间。程序员可控制应用程序中每一个片段的运行,从而编写高效率的应用程序。 ----所谓多任务通常包括两大类:多进程和多线程。进程是指在系统中正在运行的一个应用程序;线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元。对于操作系

lixt的专栏 1735

MYSQL5.7多线程复制原理

MYSQL5.7多线程复制原理 在使用mysql的过程中,复制延迟一直是一个DBA头疼的问题。 延迟优化方法: 增大从库参数innodb_buffer_pool_size的值,可以缓存更多数据,减少由于转换导致的IO压力。 增大参数innodb_log_file_size,innodb_log_file_in_group的值,减少buffer pool的磁盘IO,提升写入性能。 修改参...

weixin_40524659的博客 1385

PyQt5之 多线程

QTimer 定时器,可以对应多少秒可以触发一次,可以使用timeout 使用控制程序。 常带信号: # -*- coding: utf-8 -*- from PyQt5.QtWidgets import QWidget, QPushButton , QApplication ,QListWidget, QGridLayout , QLabel from PyQt5.QtCore import QTimer ,QDateTime import sys class W.

比卡丘不皮的博客 2383
上一篇: 多线程4
下一篇: 多线程6
鱼裤
博客等级 码龄4年 678粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼裤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值