乐于分享
好东西不私藏

JDK源码阅读(12) — CyclicBarrier:循环栅栏,让线程"凑一桌"再出发

JDK源码阅读(12) — CyclicBarrier:循环栅栏,让线程"凑一桌"再出发

在 JUC 包中,两个名字极其相似的"屏障"工具经常让人傻傻分不清楚:CountDownLatch(我们上周刚讲过)和 CyclicBarrier

简单粗暴区分:

  • CountDownLatch:等人到齐了,大门打开,各走各的(一锤子买卖)
  • CyclicBarrier:等人到齐了,一起出发,还能再等下一波(循环使用)

今天来深入剖析一下 CyclicBarrier 的源码实现。


1. 类的基本介绍

继承体系

public class CyclicBarrier {
    // ...
}

简单到没朋友——没有继承任何类没有实现任何接口。它就是一个独立的工具类。

核心作用

CyclicBarrier 的核心思想是:让一组线程相互等待,直到所有线程都到达某个公共屏障点(barrier point),然后这些线程再一起继续执行。

"Cyclic"(循环)意味着这个屏障可以被重复使用——所有线程通过后,它会自动重置,准备迎接下一波线程。

典型的应用场景:

  • 多线程并行计算,每轮"凑齐"结果后统一汇总
  • 多线程分批读取数据,每批读取完后统一处理
  • 游戏中所有玩家准备好后才开始游戏

2. 核心源码解析

2.1 全局变量

// 使用 ReentrantLock 保证线程安全
private final ReentrantLock lock = new ReentrantLock();

// 条件队列:等待"屏障被打破"(所有线程到达屏障点)
private final Condition trip = lock.newCondition();

// 需要等待的线程总数
private final int parties;

// 屏障被打破后执行的"屏障动作"(可选)
private final Runnable barrierCommand;

// 当前轮次的 Generation(代)
private Generation generation = new Generation();

// 当前这一轮还未到达屏障点的线程数
private int count;

几个关键点:

  • parties:构造时指定,固定不变。表示需要多少个线程到达屏障点,才算"凑齐一桌"。
  • count:动态变化,初始值为 parties。每有一个线程到达屏障点,count--。当 count 降到 0,屏障被打破。
  • generation:CyclicBarrier 能循环使用的核心——每一轮用一个新的 Generation 对象。
  • trip:线程在屏障点上等待的条件队列。

2.2 Generation(代)

private static class Generation {
    boolean broken = false;
}

就这么简单的一个"标记位"。当 broken = true 时,表示当前这一轮出了异常(比如某线程超时或被中断),所有等待的线程应该立即醒来并抛异常。

每一轮(每次循环)都 new 一个 Generation 对象,干净利落地重置状态。

2.3 构造方法

public CyclicBarrier(int parties) {
    this(parties, null);
}

public CyclicBarrier(int parties, Runnable barrierAction) {
    if (parties <= 0throw new IllegalArgumentException();
    this.parties = parties;
    this.count = parties;
    this.barrierCommand = barrierAction;
}

注意 barrierAction——这是 CyclicBarrier 最骚的操作:当所有线程都到达屏障点时,可以在放行之前执行一个"收尾任务"。比如所有线程都算完了,汇总一下结果。

2.4 await():核心方法

public int await() throws InterruptedException, BrokenBarrierException {
    try {
        return dowait(false0L);
    } catch (TimeoutException toe) {
        throw new Error(toe);
    }
}

public int await(long timeout, TimeUnit unit)
    throws InterruptedException, BrokenBarrierException, TimeoutException {
    return dowait(true, unit.toNanos(timeout));
}

两个 await 方法都调用了私有的 dowait 方法:

private int dowait(boolean timed, long nanos)
    throws InterruptedException, BrokenBarrierException, TimeoutException {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        final Generation g = generation;

        // 1. 检查当前代是否已损坏
        if (g.broken)
            throw new BrokenBarrierException();

        // 2. 检查线程是否被中断
        if (Thread.interrupted()) {
            breakBarrier();   // 打破屏障
            throw new InterruptedException();
        }

        // 3. 当前线程到达屏障点:count 减 1
        int index = --count;
        
        // 4. 如果这是最后一个到达的线程(index == 0)
        if (index == 0) {
            boolean ranAction = false;
            try {
                final Runnable command = barrierCommand;
                if (command != null)
                    command.run();     // 执行屏障动作
                ranAction = true;
                nextGeneration();      // 进入下一轮
                return 0;
            } finally {
                if (!ranAction)
                    breakBarrier();    // 屏障动作执行失败,打破屏障
            }
        }

        // 5. 不是最后一个到达的线程,进入等待
        for (;;) {
            try {
                if (!timed)
                    trip.await();          // 无限等待
                else if (nanos > 0L)
                    nanos = trip.awaitNanos(nanos);  // 限时等待
            } catch (InterruptedException ie) {
                // 等待中被中断
                if (g == generation && !g.broken) {
                    breakBarrier();
                    throw ie;
                } else {
                    Thread.currentThread().interrupt();
                }
            }

            // 6. 醒来后检查原因
            if (g.broken)
                throw new BrokenBarrierException();

            if (g != generation)
                return index;  // 进入了下一轮(新代),正常返回

            if (timed && nanos <= 0L) {
                breakBarrier();
                throw new TimeoutException();  // 超时
            }
        }
    } finally {
        lock.unlock();
    }
}

这个方法的逻辑非常优雅:

  1. 每个线程到达后 --count
  2. 最后一个线程index == 0)负责"撞线"——执行 barrierAction 并调用 nextGeneration() 唤醒所有等待线程、重置状态
  3. 非最后一个线程进入 condition 队列等待
  4. 等待的线程醒来后检查:如果是新代(g != generation),说明屏障被正常通过;如果是 broken,说明异常了

最后一个到达的线程有一个特权: 它是唯一不阻塞的线程,负责执行收尾工作和唤醒其他人。

2.5 nextGeneration():循环的核心

private void nextGeneration() {
    // 唤醒所有在屏障上等待的线程
    trip.signalAll();
    // 重置 count,开始新一轮
    count = parties;
    // 创建新的 Generation 对象
    generation = new Generation();
}

signalAll() 唤醒所有在 trip 条件上等待的线程,但注意——这些线程不会立即返回,它们还要在 dowait 的 for 循环中检查 g != generation

这就是 CyclicBarrier "循环"的秘诀:每一轮结束,创建新 Generation、重置 count。下一批线程到达时,又可以用 new 出来的 Generation 来验证。

2.6 breakBarrier():损坏模式

private void breakBarrier() {
    generation.broken = true;  // 标记损坏
    count = parties;           // 重置 count
    trip.signalAll();          // 唤醒所有等待线程
}

当出现异常(中断、超时、barrierAction 抛异常)时,调用此方法。标记当前代为 broken 并唤醒所有人。等待线程检查到 g.broken == true,会抛出 BrokenBarrierException

注意: 一旦屏障被打破,必须通过 reset() 方法手动重置才能重新使用:

public void reset() {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        breakBarrier();    // 打破当前代
        nextGeneration();  // 创建新代(自动打上 broken=false)
    } finally {
        lock.unlock();
    }
}

3. 核心原理总结

线程1 ──→ await() ──→ --count → index>0 → 等待 condition ──+
线程2 ──→ await() ──→ --count → index>0 → 等待 condition ──+─→ 被倒数第5个线程唤醒 → return index
线程3 ──→ await() ──→ --count → index>0 → 等待 condition ──+
线程4 ──→ await() ──→ --count → index>0 → 等待 condition ──+
线程5 ──→ await() ──→ --count → index=0 → 执行barrierAction → nextGeneration() → signalAll()

关键设计决策:

特性 CyclicBarrier CountDownLatch
重复使用 ✅ 自动重置 ❌ 一次性
"凑桌"机制 最后一个线程触发唤醒 countDown() 任意线程调用
收尾动作 barrierAction(最后一个线程执行)
返回值 到达次序(index)
异常传播 BrokenBarrierException

CyclicBarrier 使用了"合合分分"的思路:

  • :多线程在屏障点汇合等待 → trip.await()
  • :最后一个线程完成收尾,唤醒所有线程重新出发 → signalAll() + new Generation()

4. 使用示例:并行分阶段计算

import java.util.concurrent.*;

public class CyclicBarrierDemo {
    
    // 模拟 3 个阶段的并行计算
    private static final int THREAD_COUNT = 4;
    private static final int PHASES = 3;
    
    // 各线程每个阶段的"工作量"
    private static final int[][] DATA = {
        {123},
        {456},
        {789},
        {101112}
    };
    
    // 每阶段的汇总结果
    private static int phaseSum = 0;

    public static void main(String[] args) {
        // barrierAction:每轮所有线程到达后执行汇总
        CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT, () -> {
            System.out.println("=== 阶段汇总完成,当前和 = " + phaseSum + " ===");
            phaseSum = 0;  // 重置,准备下一阶段
        });

        ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
        
        // 启动 THREAD_COUNT 个并行任务
        for (int i = 0; i < THREAD_COUNT; i++) {
            final int threadId = i;
            executor.submit(() -> {
                try {
                    for (int phase = 0; phase < PHASES; phase++) {
                        int value = DATA[threadId][phase];
                        System.out.println("线程" + threadId + " 第" + (phase+1) + "阶段: 计算值=" + value);
                        
                        // 模拟计算时间
                        Thread.sleep((long)(Math.random() * 500));
                        
                        // 累加当前值
                        phaseSum += value;
                        
                        System.out.println("线程" + threadId + " 到达屏障点 (次序=" + 
                            (THREAD_COUNT - barrier.await() - 1) + ")");
                    }
                } catch (InterruptedException | BrokenBarrierException e) {
                    Thread.currentThread().interrupt();
                }
            });
        }

        executor.shutdown();
        try {
            executor.awaitTermination(10, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

运行结果示例:

线程0 第1阶段: 计算值=1
线程2 第1阶段: 计算值=7
线程3 第1阶段: 计算值=10
线程1 第1阶段: 计算值=4
线程0 到达屏障点 (次序=2)
线程2 到达屏障点 (次序=1)
线程3 到达屏障点 (次序=0)    ← 最后一个到达的线程
=== 阶段1汇总完成,当前和 = 22 ===
线程3 进入第2阶段
线程2 进入第2阶段
...

注意看:最后一个到达的线程(次序=0)负责执行 barrierAction,然后在 nextGeneration() 中唤醒所有人。


5. 注意事项

5.1 BrokenBarrierException

这是 CyclicBarrier 最独特的异常。当以下情况发生时,屏障进入"破碎"状态:

  1. 等待超时:某个线程 await(timeout) 超时 → breakBarrier()
  2. 线程被中断:等待中的线程被中断 → breakBarrier()
  3. barrierAction 抛异常:最后一个线程执行收尾动作失败 → breakBarrier()
  4. 其他线程调用了 reset():强制重置

一旦屏障破碎,所有等待的线程都会收到 BrokenBarrierException,需要自行处理。

5.2 和 CountDownLatch 的区别

CountDownLatch CyclicBarrier
可重复使用 ❌ 不能 ✅ 可以
计数方式 countDown() 外部递减 await() 自减+阻塞
"凑桌"机制 不需要全部凑齐 必须凑齐 parties 个线程
线程角色 谁都可以 countDown 每个线程都必须 await
典型场景 等待初始化完成、等待服务启动 分阶段计算、游戏匹配

5.3 性能考量

  • CyclicBarrier 内部使用 ReentrantLock + Condition,不是无锁的。在高并发下锁竞争是主要开销。
  • 如果 barrierAction 执行耗时,最后一个线程会卡在这里,其他等待线程也会被延迟唤醒。
  • 不要在线程池中混用不同 barrier timeout 的任务,否则超时时间一到就 breakBarrier(),所有线程全废。

5.4 小坑

// 错误示例:线程池线程数比 parties 少时会发生什么?
CyclicBarrier barrier = new CyclicBarrier(5);
ExecutorService pool = Executors.newFixedThreadPool(3);  // 只有3个线程!

for (int i = 0; i < 5; i++) {
    pool.submit(() -> {
        barrier.await();  // 永远凑不齐5个线程!
    });
}
// 所有线程永远阻塞在屏障点...

始终确保线程池中有足够的活跃线程来满足 barrier 的 parties 要求,否则你将会收获一个"死等"现场。


6. 对比总结

CyclicBarrier 的源码不长(大约 400 行),但设计非常精巧:

  1. Generation 机制 — 用对象隔离每一轮的状态,干净利落地实现循环
  2. 最后一个线程负责制 — 由最后一个到达的线程执行收尾并唤醒所有人,避免了额外的通知线程
  3. BrokenBarrierException — 优雅地处理了各种异常场景
  4. ReentrantLock + Condition — 借用了 AQS 的条件队列机制,代码量极少

如果你在项目中遇到"多线程分阶段处理"的场景,CyclicBarrier 是一个非常趁手的工具——比手动用 Lock + Condition 写优雅得多。

下一篇预告: PriorityQueue — 堆排序的底层,优先级队列到底怎么玩的?明天见。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-25 01:39:53 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/782820.html
  2. 运行时间 : 0.092470s [ 吞吐率:10.81req/s ] 内存消耗:4,644.94kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=0dab3e4bc17b2625897dc9ea927e18e8
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000486s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000815s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000303s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000261s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000475s ]
  6. SELECT * FROM `set` [ RunTime:0.000199s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000584s ]
  8. SELECT * FROM `article` WHERE `id` = 782820 LIMIT 1 [ RunTime:0.000454s ]
  9. UPDATE `article` SET `lasttime` = 1782322793 WHERE `id` = 782820 [ RunTime:0.000665s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000228s ]
  11. SELECT * FROM `article` WHERE `id` < 782820 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000435s ]
  12. SELECT * FROM `article` WHERE `id` > 782820 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001189s ]
  13. SELECT * FROM `article` WHERE `id` < 782820 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000611s ]
  14. SELECT * FROM `article` WHERE `id` < 782820 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000689s ]
  15. SELECT * FROM `article` WHERE `id` < 782820 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001254s ]
0.094264s