欢迎来到皮皮网网首页

【webservice源码】【批量转pdf源码】【iapp源码新快】线程结束源码_线程结束方法

来源:tp5.0源码 时间:2024-11-23 15:51:20

1.线程池中空闲的线程线程线程处于什么状态?
2.用vb6可不可以设计多线程序的应用程序,如何实现
3.Qt——QThread源码浅析

线程结束源码_线程结束方法

线程池中空闲的线程处于什么状态?

       一:阻塞状态,线程并没有销毁,也没有得到CPU时间片执行;

       源码追踪:

       for (;;) {

       ...

        workQueue.take();

       ...

       }

       public E take()...{

       ...

       while (count.get() == 0) { / /这里就是任务队列中的消息数量

       notEmpty.await();

       }

       ...

       }

       public final void await()...{

       ...

       LockSupport.park(this);

       ...

       }

       继续往下:

       public static void park(Object blocker) {

       Thread t = Thread.currentThread();

       setBlocker(t, blocker);

       U.park(false, 0L);

       setBlocker(t, null);

       }

       private static final sun.misc.Unsafe U = sun.misc.Unsafe.getUnsafe();

       //线程调用该方法,线程将一直阻塞直到超时,结束结束或者是源码中断条件出现。

       public native void park(boolean isAbsolute,线程线程 long time);

       上面就是java线程池中阻塞的源码追踪;

       二.对比object的wait()方法:

       @FastNative

       public final native void wait(long timeout, int nanos) throws InterruptedException;

       还有Thread的sleep() 方法:

       @FastNative

       private static native void sleep(Object lock, long millis, int nanos)throws...;

       可见,线程池中使用的阻塞方式并不是Object中的wait(),也不是Thread.sleep() ;

       这3个方法最终实现都是通过c&c++实现的native方法.

       三.在<<Java虚拟机(第二版)>>中,对线程状态有以下介绍:

       .4.3 状态转换

       Java语言定义了5种线程状态,在任意一个时间点,结束结束一个线程只能有且只有其中的源码webservice源码一种

       状态,这5种状态分别如下。线程线程

       1)新建(New):创建后尚未启动的结束结束线程处于这种状态。

       2)运行(Runable):Runable包括了操作系统线程状态中的源码Running和Ready,也就是线程线程处于此

       状态的线程有可能正在执行,也有可能正在等待着CPU为它分配执行时间。结束结束

       3)无限期等待(Waiting):处于这种状态的源码线程不会被分配CPU执行时间,它们要等待被

       其他线程显式地唤醒。线程线程以下方法会让线程陷入无限期的结束结束等待状态:

       ●没有设置Timeout参数的Object.wait()方法。

       ●没有设置Timeout参数的源码批量转pdf源码Thread.join()方法。

       ●LockSupport.park()方法。

       4)限期等待(Timed Waiting):处于这种状态的线程也不会被分配CPU执行时间,不过无

       须等待被其他线程显式地唤醒,在一定时间之后它们会由系统自动唤醒。以下方法会让线程

       进入限期等待状态:

       ●Thread.sleep()方法。

       ●设置了Timeout参数的Object.wait()方法。

       ●设置了Timeout参数的iapp源码新快Thread.join()方法。

       ●LockSupport.parkNanos()方法。

       ●LockSupport.parkUntil()方法。

       5)阻塞(Blocked):线程被阻塞了,“阻塞状态”与“等待状态”的区别是:“阻塞状态”在等

       待着获取到一个排他锁,这个事件将在另外一个线程放弃这个锁的时候发生;而“等待状

       态”则是在等待一段时间,或者唤醒动作的发生。在程序等待进入同步区域的星辰抄底指标源码时候,线程将

       进入这种状态。

       结束(Terminated):已终止线程的线程状态,线程已经结束执行。

用vb6可不可以设计多线程序的应用程序,如何实现

       å¤šçº¿ç¨‹æ˜¯å¯ä»¥å•Šï¼Œåªæ˜¯ä¸å¤ªå®‰å…¨ï¼Œå®¹æ˜“非法操作,

        源代码如下:

       çª—体中的代码:

       Option Explicit

       '开始

       Private Sub Command1_Click()

       On Error Resume Next

       With myThreadleft

        .Initialize AddressOf Fillleft '传递过程地址给线程

        .ThreadEnabled = True

        End With

        With myThreadright

        .Initialize AddressOf Fillright

        .ThreadEnabled = True

        End With

        With myThreadbottom

        .Initialize AddressOf Fillbottom

        .ThreadEnabled = True

        End With

       MsgBox "多线程正在运行...,看看图片框控件的变色效果!", , "信息"

       '终止线程运行

        Set myThreadleft = Nothing

        Set myThreadright = Nothing

        Set myThreadbottom = Nothing

       End Sub

       '结束

       Private Sub Command2_Click()

        Unload Me

       End Sub

       æ¨¡å—中的代码:

       Option Explicit

       '时间计数API

       Private Declare Function GetTickCount Lib "kernel" () As Long

       '声明cls_thread类的对象变量

       Public myThreadleft As New cls_thread, myThreadright As New cls_thread, myThreadbottom As New cls_thread

       Sub Main()

        Load Form1

        Form1.Show

       End Sub

       Public Sub Fillleft()

        Static Bkgcolor As Long

        Dim LongTick As Long, Longcounter As Long

        On Error Resume Next

        For Longcounter = 0 To

        DoEvents

        Bkgcolor = Longcounter Mod

        Form1.Picture1.BackColor = RGB(Bkgcolor, 0, 0)

        LongTick = GetTickCount

        While GetTickCount - LongTick < '延时毫秒,下同

        Wend

        Next

        Set myThreadleft = Nothing '如果循环结束则终止当前线程运行,下同

       End Sub

       Public Sub Fillright()

        Static Bkgcolor As Long

        Dim LongTickValue As Long, Longcounter As Long

        On Error Resume Next

        For Longcounter = 0 To

        DoEvents

        Bkgcolor = Longcounter Mod

        Form1.Picture2.BackColor = RGB(0, Bkgcolor, 0)

        LongTickValue = GetTickCount

        While GetTickCount - LongTickValue <

        Wend

        Next

       Set myThreadright = Nothing

       End Sub

       Public Sub Fillbottom()

        Static Bkgcolor As Long

        Dim LongTick As Long, Longcounter As Long

        On Error Resume Next

        For Longcounter = 0 To

        DoEvents

        Bkgcolor = Longcounter Mod

        Form1.Picture3.BackColor = RGB(0, 0, Bkgcolor)

        LongTick = GetTickCount

        While GetTickCount - LongTick <

        Wend

        Next

        Set myThreadright = Nothing

       End Sub

       ç±»æ¨¡å—中的代码:

       '功能:创建多线程类,用于初始化线程。 类名:cls_Thread

       '参数:LongPointFunction 用于接收主调过程传递过来的函数地址值

       '调用方法:1.声明线程类对象变量 Dim mythread as cls_Thread

       ' 2.调用形式:With mythread

       ' .Initialize AddressOf 自定义过程或函数名 '(初始化线程) .

       ' .ThreadEnabled = True '(设置线程是否激活)

       ' End With

       ' 3.终止调用: Set mythread = Nothing

       ' Crate By : 陈宇 On .5. Copyright(C).Ldt By CY-soft --

       ' Email:4y4ycoco@.com

       ' Test On: VB6.0+Win AND VB6.0+WinXP It's Pass !

       Option Explicit

       '创建线程API

       'æ­¤API经过改造,lpThreadAttributes改为Any型,lpStartAddress改为传值引用:

       '因为函数的入口地址由形参变量传递,如果用传址那将传递形参变量的地址而不是函数的入口地址

       Private Declare Function CreateThread Lib "kernel" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, LpthreadId As Long) As Long

       '终止线程API

       Private Declare Function TerminateThread Lib "kernel" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long

       '激活线程API

       Private Declare Function ResumeThread Lib "kernel" (ByVal hThread As Long) As Long

       '挂起线程API

       Private Declare Function SuspendThread Lib "kernel" (ByVal hThread As Long) As Long

       Private Const CREATE_SUSPENDED = &H4 '线程挂起常量

       '自定义线程结构类型

       Private Type udtThread

        Handle As Long

        Enabled As Boolean

       End Type

       Private meTheard As udtThread

       '初始化线程

       Public Sub Initialize(ByVal LongPointFunction As Long)

        Dim LongStackSize As Long, LongCreationFlags As Long, LpthreadId As Long, LongNull As Long

        On Error Resume Next

        LongNull = 0

        LongStackSize = 0

        LongCreationFlags = CREATE_SUSPENDED '创建线程后先挂起,由程序激活线程

       '创建线程并返线程句柄

        meTheard.Handle = CreateThread(LongNull, LongStackSize, ByVal LongPointFunction, LongNull, LongCreationFlags, LpthreadId)

       If meTheard.Handle = LongNull Then

        MsgBox "线程创建失败!", , "错误"

        End If

       End Sub

       '获取线程是否激活属性

       Public Property Get ThreadEnabled() As Boolean

        On Error Resume Next

        Enabled = meTheard.Enabled

       End Property

       '设置线程是否激活属性

       Public Property Let ThreadEnabled(ByVal Newvalue As Boolean)

        On Error Resume Next

        '若激活线程(Newvalue为真)设为TRUE且此线程原来没有激活时激活此线程

        If Newvalue And (Not meTheard.Enabled) Then

        ResumeThread meTheard.Handle

        meTheard.Enabled = True

        Else '若激活线程(Newvalue为真)且此线程原来已激活则挂起此线程

        If meTheard.Enabled Then

        SuspendThread meTheard.Handle

        meTheard.Enabled = False

        End If

        End If

       End Property

       '终止线程事件

       Private Sub Class_Terminate()

        On Error Resume Next

        Call TerminateThread(meTheard.Handle, 0)

       End Sub

Qt——QThread源码浅析

       在探索Qt的多线程处理中,QThread类的实现源码历经变迁。在Qt4.0.1和Qt5.6.2版本中,尽管QThread类的加盟站源码 采集声明相似,但run()函数的实现有所不同。从Qt4.4开始,QThread不再是抽象类,这标志着一些关键调整。

       QThread::start()函数在不同版本中的核心代码保持基本一致,其中Q_D()宏定义是一个预处理宏,用于获取QThread的私有数据。_beginthreadex()函数则是创建线程的核心,调用QThreadPrivate::start(this),即执行run()函数并发出started()信号。

       QThread::run()函数在Qt4.4后的版本中,不再强制要求重写,而是可以通过start启动事件循环。在Qt5.6.2版本中,run函数的定义更灵活,可以根据需要进行操作。

       关于线程停止,QThread提供了quit()、exit()和terminate()三种方式。quit()和exit(0)等效,用于事件循环中停止线程,而terminate()则立即终止线程,但不推荐使用,因为它可能引发不稳定行为。

       总结起来,QThread的核心功能包括线程的创建、run函数的执行以及线程的结束控制。从Qt4.4版本开始,QThread的使用变得更加灵活,可以根据需要选择是否重写run函数,以及如何正确地停止线程。不同版本间的细微差别需要开发者注意,以确保代码的兼容性和稳定性。