最近要写一个工具类,用静态方法控制执行的任务的最大数量。让其他的进入等待队列。主要用到了多线程的一些知识。
以下是代码
// 用于同步的锁
private static Object lock = new Object();
// 等待任务队列
private static List waitingList = new LinkedList();
// 正在运行的任务的数量
private static int workingCount = 0;
// 正在等待的任务的数量
private static volatile int waitingCount = 0;
// 最大允许同时运行的任务数量
private static int MAX_WORKING_COUNT = 100;
// 最大允许同时等待的任务数量
private static int MAX_WAITING_COUNT = 200;
// 下一个运行的任务
private static Object allowedTask = null;
// 等待运行,程序检查是否可以运行
// 如果可以,就会返回
// 如果不行,进入等待状态,直到唤醒并获得许可
public static void waitToRun(Object task)
{
waitingCount ++; // 任务进入等待状态
synchronized (lock)
{
// 如果达到允许运行任务数量的上限,则进入等待
if (workingCount == MAX_WORKING_MEMORY_COUNT)
{
System.out.println("Waiting Memory: " + waitingMemoryCount);
waitingList.add(task);
// 被唤醒后需要检查是不是自己获得了运行许可,
// 如果不是继续等待
while (task!= allowedTask)
{
try
{
lock.wait();
}
catch (InterruptedException e) {}
}
}
workingCount ++; // 任务进入运行状态
}
}
// 任务运行完成后调用
public static void leaveAfterRun()
{
synchronized(lock)
{
workingMemoryCount --;
if (!waitingList.isEmpty())
{
allowedTask = waitingList.remove(0); // 更新下一个待运行的任务
lock.notifyAll(); //通知所有调用waitToRun等待的线程
}
}
}
// 提交任务之前调用,确定是否可以提交
public static boolean canStillSubmitTask(int toSubmitCnt)
{
return (waitingCount + toSubmitCnt) <= MAX_WAITING_COUNT;
}
上述的代码其实就是运用的wait/notify方式的线程同步
分享到:
相关推荐
在这个例子中,`TaskQueue`类使用`std::queue`存储任务,`std::mutex`用于保护队列的并发访问,而`std::condition_variable`则用于线程间的通信,当有新任务加入时,等待的线程会被唤醒。 在实际应用中,任务队列常...
**C# MSMQ 消息队列工具详解** 在IT领域,消息队列(Message Queue,简称MQ)是一种常用于应用程序之间异步通信的技术。MSMQ(Microsoft Message Queuing)是微软公司提供的一种消息队列服务,它允许分布式系统中的...
本文将深入探讨消息队列的核心概念、工作原理以及如何使用消息队列工具来优化系统性能。 首先,我们需要理解什么是消息队列。消息队列是一种设计模式,它充当了生产者(发送数据的组件)和消费者(处理数据的组件)...
在Java或Android环境中,我们可以使用ArrayList或LinkedList等内置数据结构来实现循环队列,但为了更好地控制队列的头部和尾部,我们通常选择自定义一个类来实现。以下是一个简单的循环队列实现: ```java public ...
TaskQueue, 在 Swift ( by Todorov ) 中,开发了一个任务队列类 TaskQueue 目录简介安装工具CocoaPodsCarthage简单示例同步任务异步任务串行和并发任务队列控制广泛的示例信用卡许可协议介绍 TaskQueue是一个
在Java编程中,`BlockingQueue`是一个非常重要的并发工具类,它主要用于线程间的数据通信。`newFixedThreadPool`是`java.util.concurrent`包中的一个线程池工厂方法,用于创建固定数量线程的线程池。`FutureTask`则...
这些类可以用来构建分布式队列,通过它们可以轻松地实现消息传递、任务调度和并发控制。 为了实现分布式队列,我们需要考虑以下关键知识点: 1. **队列存储**:选择合适的存储机制来保存待处理的任务,如Redis、...
开发者可能会创建一个`DispatchQueuePool`类,该类封装了对全局并发队列的管理,提供了更简洁的API来调度任务。 例如,`DispatchQueuePool`可能有一个方法`enqueueTask(priority: TaskBlock)`,其中`priority`参数...
这个工具类可能会实现线程控制、断点续传、错误处理等功能,以确保下载过程的稳定性和效率。 获取绝对路径的工具类则是一个实用的辅助功能,它能够根据相对路径或者当前工作目录计算出一个文件或目录的完整路径。这...
Spring提供了一些工具类如`ConcurrentHashMap`、`AtomicInteger`等,它们具有内置的线程安全机制。此外,合理设计并发控制策略,如使用`synchronized`关键字或`Lock`接口,也是确保数据一致性的重要手段。 7. **...
在这个C++线程池的实现中,可能使用了C++11或更高版本的线程库(`<thread>`),其中包含了`std::thread`类来创建和管理线程,以及`std::queue`或`std::priority_queue`来实现任务队列。为了实现线程间的通信和同步,...
3. 创建一个工作线程类(WorkerThread),其中包含处理任务的函数,并使用QMutex和QWaitCondition来控制线程的等待和唤醒。 4. 在主线程中,使用QMutex保护QQueue,向队列中添加任务,然后使用QWaitCondition唤醒...
只需运行这个可执行文件,它会扫描并移除那些导致队列堵塞的打印任务,避免了手动通过控制面板去逐个取消或删除的繁琐步骤。 在使用此工具之前,应确保你有足够的权限来管理打印服务。通常,这需要你以管理员身份...
总结来说,消息队列是FreeRTOS中实现任务间通信的关键工具,对于理解和掌握FreeRTOS的并发控制机制至关重要。通过在C或C++中正确使用FreeRTOS提供的API,开发者可以有效地设计和实现复杂的嵌入式系统。在野火开发板...
线程池和消息队列是解决多线程环境下资源管理和任务调度的有效手段,它们在高并发、大数据量和分布式系统中具有广泛应用。 线程池是一种线程使用模式,它预先创建了一组可重用的线程,当有任务需要执行时,不再直接...
3. **并发工具**:Java并发库提供了一些工具类,如`ExecutorService`和`ThreadPoolExecutor`,它们使用队列来管理待执行的任务。这些工具可以帮助开发者有效地管理和控制并发执行的线程。 4. **优先级队列**:`...
而“工具”可能指的是使用线程池和工作队列的实用工具或库。 至于压缩包子文件的文件名称,它们看起来与支付接口有关,可能包含的是支付宝的API文档或示例代码。这些文件可能描述了商户如何接入支付宝收银台,如何...
8. 并发控制:Go的goroutine和channel是其并发模型的核心,但封装并发工具类可以提供更高级别的抽象,比如限流、信号量、任务队列等。 9. JSON序列化与反序列化:尽管Go的`encoding/json`包已经提供了基本的JSON...
标题中的“PHP实现的...总的来说,这个PHP实现的memcache环形队列类是一个实用的工具,它结合了memcache的高性能缓存能力和环形队列的数据结构特性,可用于处理需要高效并发读写的场景,如消息队列、任务调度等。
它可以避免一次性启动大量任务导致的网络拥堵,合理分配系统资源,同时允许用户控制下载的优先级和暂停、恢复操作。 三、AFNetworking中的下载管理 AFNetworking提供了AFDownloadRequestOperation类,用于处理文件...