1. 线程的概念1. 线程是进程内的独立执行路径是操作系统调度的基本单位。2. 进程是资源分配的单位一个进程内可以包含多个线程线程共享进程的内存和资源。3. 多线程的优点提高程序响应性、充分利用CPU资源、简化异步编程。2. 线程的创建方式1. 继承Thread类定义类继承Thread重写run()方法创建对象后调用start()方法启动线程。2. 实现Runnable接口定义类实现Runnable接口实现run()方法将其作为参数传入Thread对象再调用start()。3. 实现Callable接口支持返回值和异常处理需配合ExecutorService和Future使用。4. 使用线程池创建通过ExecutorService管理线程复用线程减少频繁创建销毁的开销。3. 线程的生命周期与状态1. 新建状态创建Thread对象后尚未调用start()。2. 就绪状态调用start()后等待CPU调度。3. 运行状态线程获得CPU时间片执行run()方法。4. 阻塞状态线程因sleep()、wait()、join()或同步锁等待而暂停执行。5. 死亡状态run()方法执行完毕或因异常终止。4. 线程的调度与优先级1. Java线程优先级分为1-10级默认是NORM_PRIORITY(5)优先级越高被调度的概率越大。2. 优先级只是建议最终调度由操作系统决定不保证严格按优先级执行。3. Thread.yield()方法可让当前线程主动让出CPU但不保证一定被其他线程抢占。5. 线程的终止1. 不推荐使用stop()方法该方法会强制终止线程可能导致数据不一致。2. 推荐通过设置标志位如volatile boolean isRunning控制循环结束让线程正常退出。3. 线程被中断interrupt()时会抛出InterruptedException可在catch块中处理清理工作。6. 线程的同步与互斥1. 线程安全问题多个线程同时访问共享资源可能导致数据不一致。2. 同步方法使用synchronized关键字修饰方法锁是当前对象实例保证同一时间只有一个线程执行该方法。3. 同步代码块使用synchronized(对象锁)包裹代码块锁可以是任意对象粒度更细。4. Lock锁java.util.concurrent.locks.Lock接口如ReentrantLock比synchronized更灵活支持公平锁、可中断锁。5. 死锁多个线程互相持有对方需要的锁导致无限等待。避免死锁的方法破坏请求与保持、破坏循环等待、破坏不可剥夺。7. 线程间通信1. wait()让当前线程释放锁并进入等待状态直到被notify()或notifyAll()唤醒。2. notify()唤醒等待该对象锁的一个线程。3. notifyAll()唤醒等待该对象锁的所有线程。4. 注意这三个方法必须在同步代码块/同步方法中调用且调用者必须是锁对象本身。8. 线程池1. 作用复用线程、控制并发数、管理线程生命周期避免频繁创建销毁线程的开销。2. 核心参数核心线程数、最大线程数、空闲线程存活时间、任务队列、拒绝策略。3. 常用创建方式Executors.newFixedThreadPool()固定线程数、Executors.newCachedThreadPool()可缓存线程池、Executors.newSingleThreadExecutor()单线程池。4. 关闭线程池shutdown()等待任务完成后关闭、shutdownNow()立即关闭尝试中断正在执行的任务。9. Timer定时器线程1. Timer可安排任务一次性执行或周期性执行底层由单线程调度。2. 常用方法schedule(TimerTask task, long delay)延迟执行、schedule(TimerTask task, long delay, long period)周期性执行。3. 注意单线程调度任务执行时间过长会影响后续任务任务抛出异常会导致Timer终止。