870920 Menu

多线程编程的核心类:Thread

抽象基类Thread代表一个后台运行的线程,其派生类对象执行startThread()函数即可启动一个新线程,启动该线程后,本类的threadShouldExit()函数默认返回false。如需执行一些操作处理,则在run()函数中进行编码。通常为一些比较耗时、比较规律的循环运算。毕竟,如果只是执行少量规律性的瞬时操作,根本无需冒险动用线程及并发技术等牛刀。

停止线程可调用stopThread()函数,调用此函数后,threadShouldExit()将返回true。可利用此返回值作为run()函数中的循环是否退出的判断条件。

启动和停止线程的语句,可写在派生类的构造函数与析构函数中,这样一来,每次创建派生类对象,均自动启动一个后台线程,该对象被销毁时则自动停止所启动的线程。

换个角度理解,一个Thread类的对象其实有三重职责:一是创建后台线程,二是使用所创建的后台线程执行功能性的操作处理,三是安全结束所创建的线程。

每个Thread对象均创建一个后台线程,并在自己的线程上执行操作处理。以此来实现程序的多支并发。下面给出一个使用线程技术的比较典型的示例,归纳为“后台线程5步走”:

(网站发布,代码及分步骤解释略)。

Thread是JUCE类库实现多线程并发编程的核心与基础,难能可贵的是,真正跨平台。以下几个重要的类均继承自Thread:
 InterprocessConnection 进程间连接
 InterprocessConnectionServer 进程间连接的主机端
 MidiOutput 代表操作系统中的某个MIDI输出设备
 ThreadWithProgressWindow 进度条模态对话框,可实时显示当前的处理进度
 TimeSliceThread 时间片线程(创建一个后台线程,轮流执行多个任务)
 AudioThumbnailCache 音频缩略图缓存类,继承自时间片线程类

在此特别提一下MessageManagerLock类(消息管理器锁)。该类用来确保后台线程访问主线程消息循环时线程安全。后台线程要修改Component对象的数据时,务必要使用此类(JUCE类库的Component所有派生类的对象,即程序的UI界面、控件等等,总是运行于主线程的)。

MessageManagerLock类的构造参数为当前正在执行的线程或线程池对象。后台线程run()函数中创建本类对象后,在执行功能代码之前须首先调用lockWasGained()进行判断,如果尚未锁定则直接退出。此函数是本类除构造和析构之外的唯一成员函数。

一个简单的示例: