【NanoLog】工作线程源码剖析

【NanoLog】工作线程源码剖析

NanoLogCpp17.h

NANO_LOG宏

使用示例:

NANO_LOG(NOTICE, “Hello World! This is an integer %d and a double %lf\r\n”, 1, 2.0);

#define NANO_LOG(severity, format, ...) 

第一个参数是LogLevel:一个enum类型,表示日志消息的级别。

第二个参数format:是格式化字符串

会被调用

constexpr int numNibbles = NanoLogInternal::getNumNibblesNeeded(format);
template<size_t N>
constexpr int
getNumNibblesNeeded(const char (&fmt)[N])
{
    int numNibbles = 0;
    for (int i = 0; i < countFmtParams(fmt); ++i) {
        ParamType t = getParamInfo(fmt, i);
        if (t == NON_STRING || t == DYNAMIC_PRECISION || t == DYNAMIC_WIDTH)
            ++numNibbles;
    }
        return numNibbles;
}

getNumNibblesNeeded是一个constexpr函数,如果参数在编译期已知,就可以在编译期间进行运算了。还是一个模板函数,根据fmt的数组长度会泛化不同的函数。

countFmtParames会根据fmt计算出有多少个参数,最后得到需要多少个numNibbles: 存储所有参数所需的nibbles数量

constexpr int nParams = NanoLogInternal::countFmtParams(format);

nParams就从fmt中获得一共有多少个参数

  • numNibbles:格式化字符串中,非字符串类型的参数个数,比如%d%l等参数的个数
  • nParams: 格式化字符串中,参数的个数,相当于是%的个数

下面这些必须是 "静态 "的,这样我们就可以保存这些变量的指针,并让它们在调用之后继续存在。静态的logId被用来将这个局部范围(与#NANO_LOG的扩展相联系)与一个ID联系起来,paramTypes数组被压缩函数使用,该函数在另一个线程中被调用在一个更晚的时间调用。

       //paramTypes在编译期就算出来了,是一个存放参数类型,长度为参数个数的数组。
    //通过调用analyzeFormaString模板函数,模板参数是参数个数,函数实参是格式化字符串
   static constexpr std::array<NanoLogInternal::ParamType, nParams> paramTypes = \
                                NanoLogInternal::analyzeFormatString<nParams>(format); \
    static int logId = NanoLogInternal::UNASSIGNED
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
线程池(ThreadPoolExecutor)是 Java 中用于管理和执行线程的机制。下面是ThreadPoolExecutor源码剖析: ```java public class ThreadPoolExecutor extends AbstractExecutorService { // 省略其他成员变量 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { // 根据参数创建线程池 } // 省略其他构造方法和方法重载 public void execute(Runnable command) { // 执行任务,将任务提交给线程池进行处理 } // 省略其他方法 private void runWorker(Worker w) { // 工作线程执行具体任务的逻辑 Runnable task = w.firstTask; w.firstTask = null; boolean completedAbruptly = true; try { while (task != null || (task = getTask()) != null) { // 执行任务 task.run(); task = null; } completedAbruptly = false; } finally { processWorkerExit(w, completedAbruptly); } } // 省略其他内部类和方法 } ``` 上述代码展示了ThreadPoolExecutor的主要结构。它是一个实现了ExecutorService接口的具体类,在Java中用于执行和管理线程池。 在构造方法中,我们可以设置核心线程数(corePoolSize)、最大线程数(maximumPoolSize)、空闲线程的存活时间(keepAliveTime)、时间单位(unit)和阻塞队列(workQueue)等参数。 execute方法用于向线程池提交任务,任务将被封装成一个Runnable对象,然后由线程池中的工作线程执行。 runWorker方法被工作线程调用,用于执行具体的任务逻辑。它不断地从阻塞队列中获取任务并执行,直到阻塞队列为空或工作线程被中断。 这只是ThreadPoolExecutor源码的简要剖析,了解更多细节可以查看源码实现。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值