假期学习24
第24天:多线程(上)
对应章节:第13章(前半部分)
(1)今天做了什么: 并发(交替执行)vs并行(同时执行)。进程(独立内存,资源分配单位)vs线程(共享内存,CPU调度单位)。创建线程三种方式:①继承Thread重写run(),调用start()启动(绝不可直接调run());②实现Runnable接口传入Thread构造器——更灵活不占继承名额,多线程可共享同一Runnable实例;③Callable+FutureTask——Callable有返回值可抛异常,FutureTask.get()阻塞获取结果。线程生命周期:New→Runnable(start后等CPU)→Running(获得CPU)↔Blocked(sleep/锁/wait)→Dead(run结束)。sleep()不释放锁、休眠指定毫秒;join()等待目标线程结束;yield()建议让出CPU不保证;setPriority()设优先级1-10(默认5)。练习:龟兔赛跑模拟——龟线程慢跑不停,兔线程跑得快但中途sleep睡觉,最终龟先到终点。
(2)明天准备做什么: 学完第13章多线程下半部分——synchronized同步方法/代码块、wait/notify/notifyAll线程通信、Lock接口与ReentrantLock、线程池、volatile关键字。练习生产者-消费者模型和线程池批量任务。
(3)遇到的问题: 直接调run()而非start(),方法在当前线程执行,没启新线程——排查半天发现"多线程没生效"。多个线程不sleep时交叉执行不明显,加了短暂sleep后交替更清晰,但注意这是模拟效果。ThreadLocalRandom用于多线程随机数性能比new Random好,避免竞争种子。线程名默认是Thread-0/1/2…,可用setName()改名便于调试。
浙公网安备 33010602011771号