thread run方法

合集下载

pythonGUI库图形界面开发之PyQt5线程类QThread详细使用方法

pythonGUI库图形界面开发之PyQt5线程类QThread详细使用方法

pythonGUI库图形界⾯开发之PyQt5线程类QThread详细使⽤⽅法QThread是Qt的线程类中最核⼼的底层类。

由于PyQt的的跨平台特性,QThread要隐藏所有与平台相关的代码要使⽤的QThread开始⼀个线程,可以创建它的⼀个⼦类,然后覆盖其它QThread.run()函数class Thread(QThread):def __init __(self):super(Thread,self).__ init __()def run(self):#线程相关的代码pass接下来创建⼀个新的线程thread = Thread()thread.start()可以看出,PyQt的线程使⽤⾮常简单—-建⽴⼀个⾃定义的类(如thread),⾃我继承⾃QThread ,并实现其run()⽅法即可在使⽤线程时可以直接得到Thread实例,调⽤其start()函数即可启动线程,线程启动之后,会⾃动调⽤其实现的run()的函数,该⽅法就是线程的执⾏函数业务的线程任务就写在run()函数中,当run()退出之后线程就基本结束了,QThread有started和finished信号,可以为这两个信号指定槽函数,在线程启动和结束之时执⾏⼀段代码进⾏资源的初始化和释放操作,更灵活的使⽤⽅法是,在⾃定义的QThread实例中⾃定义信号,并将信号连接到指定的槽函数,当满⾜⼀定的业务条件时发射此信号QThread类中的常⽤⽅法⽅法描述start()启动线程wait()阻⽌线程,直到满⾜如下条件之⼀与此QThread对象关联的线程已完成执⾏(即从run返回时),如果线程完成执⾏,此函数返回True,如果线程尚未启动,也返回True等待时间的单位是毫秒,如果时间是ULONG_MAX(默认值·),则等待,永远不会超时(线程必须从run返回),如果等待超时,此函数将会返回Falsesleep()强制当前线程睡眠多少秒QThread类中的常⽤信号信号描述started在开始执⾏run函数之前,从相关线程发射此信号finished当程序完成业务逻辑时,从相关线程发射此信号QThread的使⽤⽅法实例import sysfrom PyQt5.QtWidgets import *from PyQt5.QtCore import *from PyQt5.QtGui import *class MainWidget(QWidget):def __init__(self, parent=None):super(MainWidget, self).__init__(parent)#设置标题self.setWindowTitle('QThread多线程例⼦')#实例化多线程对象self.thread = Worker()#实例化列表控件与按钮控件self.listFile = QListWidget()self.btnStart = QPushButton('开始')#把控件放置在栅格布局中layout = QGridLayout(self)layout.addWidget(self.listFile, 0, 0, 1, 2)layout.addWidget(self.btnStart, 1, 1)#信号与槽函数的连接self.btnStart.clicked.connect(self.slotStart)self.thread.sinOut.connect(self.slotAdd)def slotAdd(self, file_inf):#向列表控件中添加条⽬self.listFile.addItem(file_inf)def slotStart(self):#开始按钮不可点击,线程开始self.btnStart.setEnabled(False)self.thread.start()class Worker(QThread):sinOut = pyqtSignal(str)def __init__(self, parent=None):super(Worker, self).__init__(parent)#设置⼯作状态与初始num数值self.working = Trueself.num = 0def __del__(self):#线程状态改变与线程终⽌self.working = Falseself.wait()def run(self):while self.working == True:#获取⽂本file_str = 'File index{0}'.format(self.num)self.num += 1# 发射信号self.sinOut.emit(file_str)# 线程休眠2秒self.sleep(2)if __name__ == '__main__':app = QApplication(sys.argv)demo = MainWidget()demo.show()sys.exit(app.exec_())运⾏效果图如下代码分析在这个例⼦中,单击开始按钮,会在后台定时读取数据,并把返回的数据显⽰在界⾯中,⾸先使⽤以下代码进⾏布局,把列表控件和按钮控件放在栅格布局管理器中#实例化列表控件与按钮控件self.listFile = QListWidget()self.btnStart = QPushButton('开始')#把控件放置在栅格布局中layout = QGridLayout(self)layout.addWidget(self.listFile, 0, 0, 1, 2)layout.addWidget(self.btnStart, 1, 1)然后将按钮的clicked信号连接到槽函数,单击开始触发槽函数self.btnStart.clicked.connect(self.slotStart)def slotStart(self):#开始按钮不可点击,线程开始self.btnStart.setEnabled(False)self.thread.start()⽐较复杂的是线程的信号,将线程的sinOut信号连接到slotAdd()槽函数,SlotAdd()函数负责在列表控件中动态添加字符串条⽬self.thread.sinOut.connect(self.slotAdd)def slotAdd(self,file_inf):#向列表控件中添加条⽬self.listFile.addItem(file_inf)定义⼀个线程类,继承⾃QThread,当线程启动时,执⾏run()函数class Worker(QThread):sinOut = pyqtSignal(str)def __init__(self, parent=None):super(Worker, self).__init__(parent)#设置⼯作状态与初始num数值self.working = Trueself.num = 0def __del__(self):#线程状态改变与线程终⽌self.working = Falseself.wait()def run(self):while self.working == True:#获取⽂本file_str = 'File index{0}'.format(self.num)self.num += 1# 发射信号self.sinOut.emit(file_str)# 线程休眠2秒self.sleep(2)多线程失败案例import sysfrom PyQt5.QtWidgets import *from PyQt5.QtCore import *from PyQt5.QtGui import *global secsec=0def setTime():global secsec+=1#Led显⽰数字+1lcdNumber.display(sec)def work():#计时器每秒计数timer.start(1000)for i in range(200000000):passtimer.stop()if __name__ == '__main__':app=QApplication(sys.argv)top=QWidget()top.resize(300,120)#垂直布局layout=QVBoxLayout(top)#添加⼀个显⽰⾯板lcdNumber=QLCDNumber()layout.addWidget(lcdNumber)button=QPushButton('测试')layout.addWidget(button)timer=QTimer()#每次计时结束,触发setTimetimer.timeout.connect(setTime)button.clicked.connect(work)top.show()sys.exit(app.exec_())失败效果图如下长时间停留在此界⾯,知道多线程任务完成后,此界⾯才会动,当耗时程序⾮常⼤时,就会造成程序运⾏失败的假象,实际还是在后台运⾏的,只是没有显⽰在主窗⼝的界⾯上,当然⽤户体验也就⾮常差,那么如何解决这个问题呢,下⾯实例三进⾏解答分离UI主线程与⼯作线程实例import sysfrom PyQt5.QtCore import *from PyQt5.QtGui import *from PyQt5.QtWidgets import *global secsec = 0class WorkThread(QThread):#实例化⼀个信号对象trigger = pyqtSignal()def __int__(self):super(WorkThread, self).__init__()def run(self):#开始进⾏循环for i in range(2000000000):pass# 循环完毕后发出信号self.trigger.emit()def countTime():global secsec += 1# LED显⽰数字+1lcdNumber.display(sec)def work():# 计时器每秒计数timer.start(1000)# 计时开始workThread.start()# 当获得循环完毕的信号时,停⽌计数workThread.trigger.connect(timeStop)def timeStop():#定时器停⽌timer.stop()print("运⾏结束⽤时", lcdNumber.value())global secsec = 0if __name__ == "__main__":app = QApplication(sys.argv)top = QWidget()top.resize(300, 120)# 垂直布局类QVBoxLayoutlayout = QVBoxLayout(top)# 加显⽰屏,按钮到布局中lcdNumber = QLCDNumber()layout.addWidget(lcdNumber)button = QPushButton("测试")layout.addWidget(button)#实例化定时器与多线程类timer = QTimer()workThread = WorkThread()button.clicked.connect(work)# 每次计时结束,触发 countTimetimer.timeout.connect(countTime)top.show()sys.exit(app.exec_())运⾏效果,程序主界⾯的数值会每秒增加1,直到循环结束,这⾥就避免了主界⾯长时间不动的尴尬!QThread线程事件处理实例对于执⾏很耗时的程序来说,由于PyQt需要等待程序执⾏完毕才能进⾏下⼀步,这个过程表现在界⾯上就是卡顿,⽽如果需要执⾏这个耗时程序时不断的刷新界⾯。

Java多线程详解——一篇文章搞懂Java多线程

Java多线程详解——一篇文章搞懂Java多线程

Java多线程详解——⼀篇⽂章搞懂Java多线程⽬录1. 基本概念程序(program)程序是为完成特定任务、⽤某种语⾔编写的⼀组指令的集合。

即指⼀段静态的代码(还没有运⾏起来),静态对象。

进程(process)进程是程序的⼀次执⾏过程,也就是说程序运⾏起来了,加载到了内存中,并占⽤了cpu的资源。

这是⼀个动态的过程:有⾃⾝的产⽣、存在和消亡的过程,这也是进程的⽣命周期。

进程是系统资源分配的单位,系统在运⾏时会为每个进程分配不同的内存区域。

线程(thread)进程可进⼀步细化为线程,是⼀个程序内部的执⾏路径。

若⼀个进程同⼀时间并⾏执⾏多个线程,那么这个进程就是⽀持多线程的。

线程是cpu调度和执⾏的单位,每个线程拥有独⽴的运⾏栈和程序计数器(pc),线程切换的开销⼩。

⼀个进程中的多个线程共享相同的内存单元/内存地址空间——》他们从同⼀堆中分配对象,可以访问相同的变量和对象。

这就使得相乘间通信更简便、搞笑。

但索格线程操作共享的系统资源可能就会带来安全隐患(隐患为到底哪个线程操作这个数据,可能⼀个线程正在操作这个数据,有⼀个线程也来操作了这个数据v)。

配合JVM内存结构了解(只做了解即可)class⽂件会通过类加载器加载到内存空间。

其中内存区域中每个线程都会有虚拟机栈和程序计数器。

每个进程都会有⼀个⽅法区和堆,多个线程共享同⼀进程下的⽅法区和堆。

CPU单核和多核的理解单核的CPU是⼀种假的多线程,因为在⼀个时间单元内,也只能执⾏⼀个线程的任务。

同时间段内有多个线程需要CPU去运⾏时,CPU也只能交替去执⾏多个线程中的⼀个线程,但是由于其执⾏速度特别快,因此感觉不出来。

多核的CPU才能更好的发挥多线程的效率。

对于Java应⽤程序java.exe来讲,⾄少会存在三个线程:main()主线程,gc()垃圾回收线程,异常处理线程。

如过发⽣异常时会影响主线程。

Java线程的分类:⽤户线程和守护线程Java的gc()垃圾回收线程就是⼀个守护线程守护线程是⽤来服务⽤户线程的,通过在start()⽅法前调⽤thread.setDaemon(true)可以吧⼀个⽤户线程变成⼀个守护线程。

多线程调用静态方法

多线程调用静态方法

多线程调用静态方法多线程调用静态方法是一种常见的并发编程技术,它可以提高程序的执行效率和性能。

在多线程环境下,多个线程可以同时调用同一个静态方法,从而实现并发执行。

本文将介绍多线程调用静态方法的原理、实现方法和注意事项。

在Java中,静态方法是属于类的,而不是属于对象的。

因此,多个线程可以同时调用同一个静态方法,而不会出现线程安全问题。

当多个线程同时调用静态方法时,JVM会为每个线程创建一个独立的栈帧,用于保存方法的局部变量和操作数栈。

这样,每个线程都可以独立地执行方法,而不会相互干扰。

二、多线程调用静态方法的实现方法在Java中,多线程调用静态方法的实现方法有两种:继承Thread 类和实现Runnable接口。

下面分别介绍这两种方法的实现步骤。

1. 继承Thread类继承Thread类是一种比较简单的多线程实现方法。

具体步骤如下:(1)定义一个继承自Thread类的子类,并重写run()方法。

(2)在run()方法中调用静态方法。

(3)创建多个子类对象,并调用start()方法启动线程。

示例代码如下:```public class MyThread extends Thread {public void run() {MyClass.staticMethod();}}public class Test {public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();t1.start();t2.start();}}```2. 实现Runnable接口实现Runnable接口是一种更加灵活的多线程实现方法。

具体步骤如下:(1)定义一个实现了Runnable接口的类,并实现run()方法。

(2)在run()方法中调用静态方法。

(3)创建多个Runnable对象,并将它们作为参数传递给Thread 类的构造方法。

pyside qthread用法

pyside qthread用法

pyside qthread用法PySide是Python语言的一种GUI开发框架,可用于创建跨平台的桌面应用程序。

在PySide中,QThread是一个多线程类,用于在应用程序中执行异步操作,以避免阻塞GUI线程。

本文将介绍PySide中QThread的使用方法,从基本概念到具体实例和最佳实践。

第一步:了解QThreadQThread是一个用于创建多线程的类,继承自QtCore.QThread。

PySide的QThread类提供了管理线程的方法和信号槽机制,使得在应用程序中使用多线程变得更加简单。

QThread的两个关键方法是run()和start()。

在派生类中,可以重写run()方法来定义线程的主体逻辑。

start()方法用于启动线程并运行run()方法。

第二步:创建自定义的线程类在使用QThread时,通常会创建一个自定义的线程类,以便在其中定义线程的逻辑。

下面是一个示例:pythonfrom PySide6.QtCore import QThreadclass MyThread(QThread):def __init__(self):super().__init__()def run(self):# 线程的主体逻辑print("Thread is running")在上面的代码中,我们创建了一个名为MyThread的自定义线程类,继承自QThread。

在run()方法中,我们简单地打印一条消息。

这只是一个简单的例子,你可以根据自己的需求在run()方法中实现更复杂的逻辑。

第三步:启动线程要启动线程,我们需要创建一个线程对象并调用start()方法。

下面是一个示例:pythonthread = MyThread()thread.start()在上面的代码中,我们创建了一个名为thread的MyThread对象,并调用start()方法来启动线程。

一旦start()方法被调用,线程将开始运行并执行定义在run()方法中的逻辑。

Android常用的开启子线程的方法

Android常用的开启子线程的方法

Android常用的开启子线程的方法在Android开发中,开启子线程是非常常见的操作。

子线程可以用于执行耗时操作,避免阻塞主线程,提升用户体验。

下面将介绍Android常用的开启子线程的方法。

1. 使用Thread类开启子线程:Thread是Java中最基本的线程类,Android中也可以使用它来开启子线程。

可以通过继承Thread类或者通过创建匿名内部类的方式来实现。

继承Thread类的方式:```public class MyThread extends Threadpublic void ru//子线程要执行的操作}//在主线程中开启子线程MyThread myThread = new MyThread(;myThread.start(;```匿名内部类的方式:```Thread thread = new Thread(new Runnablpublic void ru//子线程要执行的操作}});//在主线程中开启子线程thread.start(;```2. 使用Runnable接口开启子线程:Runnable接口是代表一个任务的接口,可以通过实现这个接口来开启子线程。

与使用Thread类不同的是,使用Runnable接口可以更好地实现线程的复用。

实现Runnable接口的方式:```public class MyRunnable implements Runnablepublic void ru//子线程要执行的操作}//在主线程中开启子线程MyRunnable myRunnable = new MyRunnable(;Thread thread = new Thread(myRunnable);thread.start(;```3. 使用Handler开启子线程:Handler是Android中用于线程间通信的机制,可以通过Handler在子线程中执行一些操作,并将结果传递给主线程。

java多线程调用方法

java多线程调用方法

java多线程调用方法Java是一种广泛使用的编程语言,它支持多线程编程,使得程序员能够更加高效地利用计算机资源。

在Java中,多线程编程是一种非常常见的编程方式,它可以让程序在不同的线程中同时执行不同的任务,从而提高程序的运行效率和性能。

然而,在实际编程中,多线程编程并不是一件容易的事情。

由于多线程编程涉及到线程之间的同步和互斥问题,如果处理不当,就会导致程序出现各种问题,比如死锁、数据竞争等。

因此,程序员需要掌握一些基本的多线程编程技巧和方法,以确保程序的正确性和稳定性。

本文将介绍Java多线程调用方法的相关知识,包括如何创建线程、如何启动线程、如何停止线程、如何等待线程结束等。

希望能为读者提供一些帮助和指导。

一、创建线程在Java中,创建线程有两种方式:继承Thread类和实现Runnable接口。

继承Thread类是一种比较简单的方式,只需要定义一个类,继承Thread类并重写run()方法即可。

例如:```public class MyThread extends Thread {public void run() {// 线程执行的代码}}```实现Runnable接口是一种更加灵活的方式,它允许多个线程共享同一个Runnable对象,从而实现资源共享。

例如:```public class MyRunnable implements Runnable {public void run() {// 线程执行的代码}}```在创建线程时,需要注意以下几点:1. 线程的启动必须在主线程中进行,否则会导致程序出现异常。

2. 线程的启动必须调用start()方法,而不是run()方法。

如果调用run()方法,会导致线程在主线程中执行,而不是在新线程中执行。

3. 线程的启动顺序是不确定的,由操作系统决定。

二、启动线程在创建线程后,需要启动线程,让它开始执行。

启动线程的方式是调用线程对象的start()方法。

Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等

Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等

方法一:(java习惯,在android不推荐使用)刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题new Thread( new Runnable() {public void run() {myView.invalidate();}}).start();可以实现功能,刷新UI界面。

但是这样是不行的,因为它违背了单线程模型:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。

方法二:(Thread+Handler)查阅了文档和apidemo后,发觉常用的方法是利用Handler来实现UI线程的更新的。

Handler来根据接收的消息,处理UI更新。

Thread线程发出Handler消息,通知更新UI。

Handler myHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case TestHandler.GUIUPDATEIDENTIFIER:myBounceView.invalidate();break;}super.handleMessage(msg);}};class myThread implements Runnable {public void run() {while (!Thread.currentThread().isInterrupted()) {Message message = new Message();message.what = TestHandler.GUIUPDATEIDENTIFIER;TestHandler.this.myHandler.sendMessage(message);try {Thread.sleep(100);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}以上方法demo看:/blog/411860方法三:(java习惯,不推荐)在Android平台中需要反复按周期执行方法可以使用Java上自带的TimerTask类,Tim erTask相对于Thread来说对于资源消耗的更低,除了使用Android自带的AlarmManager使用Timer定时器是一种更好的解决方法。

java runnable 用法

java runnable 用法

在Java中,可以使用Runnable接口来实现多线程编程。

Runnable接口是一个函数式接口,它只包含了一个抽象方法run(),用于定义线程的执行逻辑。

通过实现Runnable接口,可以将自定义的任务逻辑封装成一个线程,并在需要的时候启动它。

以下是关于Runnable接口的详细使用方法:1.实现Runnable接口:创建一个类并实现Runnable接口,重写run()方法来定义线程执行的任务逻辑。

public class MyRunnable implements Runnable{@Overridepublic void run(){// 线程执行的任务逻辑System.out.println("This is my runnable task.");}}1.创建Thread对象:创建一个Thread对象,并将实现了Runnable接口的实例作为参数传递给Thread的构造函数。

MyRunnable myRunnable =new MyRunnable();Thread thread =new Thread(myRunnable);1.启动线程:通过调用start()方法来启动线程。

此时会自动调用run()方法,执行线程的任务逻辑。

thread.start();除了实现Runnable接口外,还可以使用匿名类来创建线程,如下所示:Thread thread =new Thread(new Runnable(){@Overridepublic void run(){// 线程执行的任务逻辑System.out.println("This is my anonymous runnable task.");}});thread.start();在实际开发中,使用Runnable接口可以更灵活地处理线程任务,因为它可以避免单继承带来的限制,并且能够更好地支持多态特性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

thread run方法
Java中,线程是实现多任务的基础。

线程就是程序中的一个执行路径,一个线程的启动就是一个子任务的启动。

Java中线程可以由两种方式来创建:继承Thread类和实现Runnable接口。

Thread类是Java中表示一个线程的类,我们可以继承Thread类来创建自己的线程类。

Thread类中有一个方法叫做run(),它是线程执行时的核心方法。

我们需要实现这个方法
来定义线程的工作内容。

下面我们来学习一下Thread类中的run方法。

run方法的定义如下:
```java
public void run(){
}
```
run方法是线程执行时的核心方法,线程需要执行的任务都在这个方法中实现。

当线
程启动后,run方法就会被自动调用,线程就开始了执行。

当run方法执行完毕,线程就
结束了。

在自定义线程时,我们需要重写Thread类中的run方法,实现线程的工作内容。

下面我们来看一个简单的例子。

```java
public class MyThread extends Thread{
@Override
public void run(){
System.out.println("我是一个线程!");
}
}
```
以上代码定义了一个MyThread类,它继承自Thread类,并重写了run方法。

在run 方法中,我们只是简单地打印了一句话。

继承Thread类
在上面的示例中,我们定义了一个MyThread的实例对象,并调用它的start方法来启动线程。

当线程启动时,它会调用MyThread中的run方法。

实现Runnable接口
总结
线程是Java中一种强大的多任务机制,线程的启动有两种方式:继承Thread类和实现Runnable接口。

当线程启动时,它会调用run方法,我们需要实现run方法来定义线程的工作内容。

在这篇文章中,我们学习了Thread类中的run方法,了解了如何定义线程的工作内容。

通过这篇文章的学习,相信大家已经有了更深入的理解。

相关文档
最新文档