Java线程基础与共享资源详解:从Runnable到Executor

1星 需积分: 13 3 下载量 40 浏览量 更新于2024-07-26 收藏 1.1MB PDF 举报
Java线程学习笔记涵盖了Java编程中关于线程和并发处理的核心概念,从基础知识到处理共享资源的技术。以下是详细的内容概览: 一、基本知识 1. **任务Runnable**:Runnable接口是Java中用于创建线程的基本单元,它定义了一个run()方法,当线程启动时,run()方法中的代码会作为线程的任务被执行。通过实现Runnable接口,可以在不继承Thread类的情况下,为线程分配任务。 2. **线程构造器Thread**:Java提供Thread类的构造器,可以直接创建并启动一个线程,通常结合Runnable实例使用。另一种方式是通过Thread类的run()方法或重写Thread类的start()方法来执行Runnable对象。 3. **执行器Executor**:Executor接口和其实现类如ThreadPoolExecutor提供了更高级的线程管理,允许程序员将Runnable或Callable任务提交给线程池,简化了线程创建和管理。它隐藏了线程的创建和销毁细节,提供可配置的线程池大小、线程执行策略等功能。 4. **任务中返回值Callable接口**:如果线程任务需要返回结果,可以使用Callable接口,它扩展了Runnable,提供了call()方法,可以返回值并且可以抛出异常。通常配合Future和ExecutorService一起使用。 5. **休眠(sleep())和让步(yield())**:sleep()方法使当前线程进入睡眠状态指定的时间,yield()方法则允许当前正在执行的线程暂停执行,但不会导致线程被中断,其他线程有机会运行。 6. **优先级设置**:线程可以通过Thread类的setPriority()方法设置优先级,但实际效果受操作系统限制,并不是绝对的。 7. **后台线程(daemon)**:后台线程在主线程结束前不会阻止程序退出,主要用于维护任务,如垃圾回收。 8. **加入线程(join())**:线程间通过join()方法可以使主线程等待子线程执行完毕再继续。 9. **捕获异常(UncaughtExceptionHandler)**:通过设置UncaughtExceptionHandler,可以在线程发生未捕获异常时处理异常,避免程序崩溃。 10. **线程与任务的关系**:线程是执行任务的载体,而任务则是线程需要完成的工作单元。 11. **让后计算(post-conditions)**:确保任务完成后线程的行为,如清理工作或者更新共享状态。 二、共享受限资源 1. **解决共享资源(synchronized、lock)**:Java提供了synchronized关键字和Lock接口来保证多线程环境下对共享资源的互斥访问。synchronized修饰同步代码块或方法,而Lock接口提供了更灵活的锁管理。 2. **原子性与易变性(volatile)**:volatile关键字用于确保变量的可见性和禁止指令重排序,保证多线程环境下的数据一致性。原子类如AtomicInteger、AtomicLong和AtomicReference提供了原子操作。 3. **线程本地存储(ThreadLocal)**:ThreadLocal为每个线程提供一个独立的副本,避免了共享变量的竞争,提高并发性能。 4. **线程阻塞**:包括通过sleep()方法让线程休眠,等待I/O操作完成,以及wait()方法让线程挂起直到被唤醒。 5. **线程合作(wait()、notify()、notifyAll())**:wait()、notify()和notifyAll()方法用于线程间的通信,wait()使当前线程等待,notify()唤醒一个等待线程,notifyAll()唤醒所有等待线程。 Java线程学习笔记深入浅出地介绍了Java中如何管理和控制线程,如何正确处理并发场景中的同步问题,以及如何利用各种工具和技术优化并发性能。掌握这些知识点有助于编写高效、可靠的并发程序。