本文介绍一种采用线程交互模型,即主线程执行队列的Task,其他线程投递Task进入主线程的任务队列,投递方式类似于Win32 SDK的PostMessage和SendMessage方法,提供异步投递和同步投递。
首先我们需要一个BlockAndAwaitableQueue类,该类的功能是提供除执行Task线程外的其他线程的任务投递功能,该类包含一个任务列表,即存放待执行的Task。同时要考虑到多线程的同步问题,需要采用同步锁进行同步。同时要保证BlockAndAwaitableQueue的主执行线程在无Task可执行时不占用过多的系统资源需要实现一种monitor模型。即在没有Task可执行时,需要使该线程进入等待队列中,而在有Task投入进来时,需要唤醒Task列表中的等待队列中的当前执行线程。该模型有个限制,即所提交的Task不应占用过多的执行时间。
public class BlockAndAwaitableQueue{
private ArrayList taskList = new ArrayList();
private volatile boolean bStop = false;
private volatile boolean bRunning = false;
private Thread runningThread;
Runnable finalTask = new Runnable()
{
public void run()
{
System.out.println("runningThread will exit.");
synchronized (this) {
bRunning = false;
System.out.println("notify ...");
synchronized (runningThread) {
runningThread.notifyAll();
}
}
System.out.println("runningThread exit.");
}
};
public BlockAndAwaitableQueue()
{
}
/*
* This can be called by runningThread and other threads.
* @param task The task wants to be executed asychronized.
*/
public void addTask(Runnable task)
{
synchronized(taskList)
{
taskList.add(task);
// notify
taskList.notifyAll();
}
}
/*
* This can not be called by the runningThread
*/
public void addTaskAndAwait(final Runnable task)
{
if(runningThread == Thread.currentThread())
{
System.out.println("This can not be called by the runningThread");
return;
}
final Object latchObject = new Object();
synchronized(latchObject)
{
addTask(new Runnable(){
public void run()
{
task.run();
synchronized(latchObject)
{
latchObject.notify();
}
}
});
try {
latchObject.wait();
} catch (InterruptedException e) {
}
}
}
public void stopInvocation()
{
bStop = true;
addTask(finalTask);
}
public void stopInvocationAndAwait()
{
bStop = true;
addTaskAndAwait(finalTask);
}
private void doInvocations()
{
synchronized(taskList)
{
while(taskList.size() == 0)
{
try {
taskList.wait();
} catch (InterruptedException e) {
}
}
for(int i=0; i < taskList.size(); i++)
{
Runnable task = (Runnable)taskList.get(i);
task.run();
task = null;
}
// clear the task list
taskList.clear();
}
}
public void run()
{
synchronized (this) {
while(bRunning)
{
try {
System.out.println("await ...");
synchronized (runningThread) {
runningThread.wait();
}
System.out.println("await over");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
bRunning = true;
}
runningThread = Thread.currentThread();
bStop = false;
while(!bStop)
{
doInvocations();
}
}
public static void main(String[] args)
{
final BlockAndAwaitableQueue taskQueue = new BlockAndAwaitableQueue();
new Thread(new Runnable(){
public void run()
{
taskQueue.run();
}
}).start();
new Thread(new Runnable(){
public void run()
{
taskQueue.run();
}
}).start();
new Thread(new Runnable(){
public void run()
{
taskQueue.addTaskAndAwait(new Runnable(){
public void run()
{
System.out.println("Task ID#1 has been executed.");
}
});
System.out.println("After Task ID#1 has been executed.");
}
}).start();
new Thread(new Runnable(){
public void run()
{
taskQueue.addTask(new Runnable(){
public void run()
{
System.out.println("Task ID#2 has been executed.");
//stop the queue
}
});
}
}).start();
new Thread(new Runnable(){
public void run()
{
taskQueue.stopInvocationAndAwait();
taskQueue.stopInvocationAndAwait();
}
}).start();
}
}
分享到:
相关推荐
在这篇论文中,作者提出了一种针对高保真雷达网络整体性能仿真评估需求的分布式多线程交互框架的设计与实现方法。为了解决雷达网络的仿真问题,该论文基于QualNet这款网络仿真软件,提出了一个雷达网络分布式仿真...
STA是一种线程模型,其中所有COM对象都在同一个线程上执行,确保了同一时间只有一个线程能访问这些对象。这简化了线程同步,因为不需要对对象进行额外的锁定。典型的例子是用户界面(UI)线程,它通常运行在STA中,...
主要有以下几种线程模型: - **Worker Thread**:开发者自定义的工作线程,用于处理耗时任务。 - **Intent Service**:为一次性后台任务设计,当任务完成后会自动停止服务。 - **Handler/Looper/Message Queue**...
本示例主要关注如何在GUI中实现多线程交互,以及如何利用`backgroundWorker`组件来避免阻塞主线程。以下是关于这个主题的详细讲解。 一、多线程 多线程是指在一个进程中同时执行多个独立的代码段,这些代码段被...
5. **线程池**:线程池是一种线程复用机制,可以提高创建和销毁线程的效率。通过`ThreadPool.QueueUserWorkItem`方法,可以将任务添加到线程池,由系统自动管理线程的生命周期。 6. **状态管理**:在多线程环境中,...
总结来说,"IOCP多线程socket模型"是一种高级的网络编程模型,适用于构建高性能、高并发的服务器应用。`iocp_server`和`iocp_client`示例代码提供了理解和实践这一模型的宝贵资源。通过深入学习和理解这个模型,...
串行模式和并行模式是两种常见的线程处理模型,分别对应串行执行和并行执行两种处理方式。在串行模式中,消息接收和处理都是在同一个线程中完成的,而在并行模式中,消息接收和处理是分离的,处理部分被投递到后台...
VB多线程控件是开发者用来实现这一功能的一种工具,但正如标题和描述所指出的,虽然可以实现简单的多线程,但确实存在一些限制和挑战。 首先,我们要理解什么是线程。线程是程序执行的基本单元,每个线程都有自己的...
生产者消费者模型是一种经典的并发设计模式,它将数据的生产和消费分隔开来。在串口通信中,生产者(通常是读取线程)负责从串口接收数据,而消费者(可能是另一个线程或UI线程)负责解析和处理这些数据。Qt中的信号...
总的来说,顺序一致性模型提供了一种理想化但不现实的并发执行视图,而实际的多线程编程需要考虑到硬件和编译器的优化行为。理解这些优化以及如何通过编程手段来约束它们,是编写高效且正确的多线程代码的关键。在...
2. **线程模型**:Linux内核提供两种线程模型,即NPTL(Native POSIX Thread Library)和旧的OSS(Operating System Services)线程库。NPTL是目前的主流,它实现了POSIX线程标准,提供了更好的性能和兼容性。 3. *...
线程池提供了一种线程复用机制,固定数量的线程等待任务,如Java的`FixedThreadPool`,或者根据需求动态调整线程数量如`CachedThreadPool`。线程池可以避免频繁创建和销毁线程,提高系统效率。 6. **线程池的实现*...
在安卓开发中,线程消费者模型是一种常见的多线程编程模式,用于实现高效的数据处理和交互。这个模型通常包括生产者(Producer)和消费者(Consumer)两个角色,它们分别负责数据的生产和消费。理解并掌握这种模型...
1. **TCP协议**:TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保了数据包在网络中的顺序传输和错误校验,通过三次握手建立连接,四次挥手断开连接,提供可靠的数据传输服务。 2. **Socket接口**...
Java作为一种高度抽象化的编程语言,致力于提供统一的内存管理模型,以便开发者能够跨平台地编写多线程程序。为此,Java引入了一个核心概念——Java内存模型(Java Memory Model, JMM),其目的是规范线程和内存之间...
构件模型则是软件开发中的一种方法论,它将系统分解成独立的、可重用的和可互换的部分,称为构件。这些构件可以通过定义良好的接口和协议进行交互,提高开发效率和系统的可维护性。 OpenMP并行编程方法 OpenMP是一...
本文提出了一种基于分区缓存区重放与多线程交互的多智能体深度强化学习算法(Partitioned Buffer Replay and Multiple Process Interaction,PBR-MPI),旨在解决传统深度强化学习中学习效率低、训练时间长的问题。...