线程池相关/queue

timer原理:https://www.cnblogs.com/yougewe/p/9729043.html

通过不断的轮循来处理的。

Java提供Timer和ScheduledThreadPoolExecutor两个类实现定时任务,其中Timer简单易用,但所有任务都是由同一个线程来调度,任务串行执行,任务之间存在互相干扰,

一是前一个任务的延迟会导致后面的任务延迟,源码如下:schedule与scheduleAtFixedRate区别

queue.rescheduleMin( task.period<0 ? currentTime - task.period : executionTime + task.period);

二是前一个任务异常导致后面的任务不再执行,如果执行时间大于period,schedule则会在任务完成后,经过period再执行新一次任务;而scheduleAtFixedRate就是保持不变的执行间隔。于是,新任务立马执行!所以,scheduleAtFixedRate的执行间隔变为每次任务执行完再执行新的一次。

三是Timer执行周期任务时依赖系统时间,如果当前系统时间发生变化(使用的是 System.currentTimeMillis()),执行行为也会出现变化。

相关queue,最小堆!!!: https://blog.youkuaiyun.com/zhangzhetaojj/article/details/81014408

注意的是,nanoTime和系统时间是完全无关的(之前一直以为只是时间戳的纳秒级粒度)

(Timer和ScheduledThreadPoolExecutor的区别https://www.jianshu.com/p/25eea3863d14

各类queue分析

java这里有这么多queue, 是应该分析学习下各个的不同

 

  • ConcurrentLinkedQueue: 一个由链表结构组成的非阻塞队列
  • ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列
  • LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列
  • PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列
  • DelayQueue:一个使用优先级队列实现的无界阻塞队列
  • SynchronousQueue:一个不存储元素的阻塞队列
  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列
  • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列

待续。。。

=========

创建线程池的一般步骤如下: 1. 定义一个任务队列,用于存储需要执行的任务; 2. 创建一组线程,线程数需要根据实际情况进行调整; 3. 在每个线程中循环执行以下操作: a. 从任务队列中取出一个任务; b. 执行任务; c. 如果任务队列为空,则等待新任务的到来。 下面给出一个简单的 C++ 线程池的实现代码: ```c++ #include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <queue> #include <functional> using Task = std::function<void()>; class ThreadPool { public: ThreadPool(int threadCount) { for (int i = 0; i < threadCount; ++i) { threads_.emplace_back(std::thread([this] { while (true) { Task task; { std::unique_lock<std::mutex> lock(mutex_); condition_.wait(lock, [this] { return !tasks_.empty() || stop_; }); if (stop_ && tasks_.empty()) return; task = std::move(tasks_.front()); tasks_.pop(); } task(); } })); } } ~ThreadPool() { { std::unique_lock<std::mutex> lock(mutex_); stop_ = true; } condition_.notify_all(); for (auto& thread : threads_) { thread.join(); } } template<class F, class... Args> auto enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type> { using ReturnType = typename std::result_of<F(Args...)>::type; auto task = std::make_shared<std::packaged_task<ReturnType()>>(std::bind(std::forward<F>(f), std::forward<Args>(args)...)); std::future<ReturnType> result = task->get_future(); { std::unique_lock<std::mutex> lock(mutex_); if (stop_) { throw std::runtime_error("enqueue on stopped ThreadPool"); } tasks_.emplace([task]() { (*task)(); }); } condition_.notify_one(); return result; } private: std::vector<std::thread> threads_; std::queue<Task> tasks_; std::mutex mutex_; std::condition_variable condition_; bool stop_ = false; }; ``` 使用方法如下: ```c++ #include <iostream> #include <chrono> void print(const std::string& str, int n) { for (int i = 0; i < n; ++i) { std::cout << str << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(100)); } } int main() { ThreadPool pool(4); auto f1 = pool.enqueue(print, "hello", 5); auto f2 = pool.enqueue(print, "world", 5); f1.get(); f2.get(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值