暑期学习:自学java第二十八天
第十六章笔记整理
1.进程与线程:进程是系统资源分配的基本单位,拥有独立内存。线程是进程的执行单元,共享进程资源,创建和切换开销更小。
1.创建线程的三种方式:
继承Thread类:重写run()方法,通过start()启动。缺点是Java单继承限制,且线程间不易共享实例变量。
实现Runnable接口:实现run()方法,将实例作为Thread的target。优点是避免了单继承局限,适合多个线程处理同一份资源。
实现Callable接口:实现call()方法,配合FutureTask使用。优点是call()方法可以有返回值,并且可以声明抛出异常。
2.线程生命周期:包含新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)五种状态。
2.线程控制与同步
1.线程控制方法:
join():等待指定线程终止。
后台线程(Daemon):为其他线程提供服务,当所有前台线程死亡后自动结束。
sleep():使当前线程暂停指定时间,进入阻塞状态,但不释放锁。
yield():使当前线程暂停,转入就绪状态,让出CPU给同优先级或更高优先级的线程。
2.线程同步:为解决多线程并发访问共享资源导致的数据安全问题。
同步代码块:使用synchronized(obj),obj作为同步监视器(锁)。
同步方法:使用synchronized修饰方法,实例方法的锁是this。
同步锁(Lock):Java 5引入的ReentrantLock,需要显式地加锁lock()和释放锁unlock(),比synchronized更灵活。
死锁:两个或多个线程互相等待对方释放锁,导致程序僵持。
3.线程通信与高级特性
1.线程通信:
传统方式:使用Object类的wait()、notify()、notifyAll()方法,必须在同步代码块或方法中调用。
Condition控制:配合Lock使用,提供await()、signal()、signalAll()方法,功能更强大。
阻塞队列(BlockingQueue):如ArrayBlockingQueue,当队列满时生产者线程阻塞,队列空时消费者线程阻塞。
2.线程池(ThreadPool):避免频繁创建和销毁线程的开销,提高性能。
Executors工厂类:提供newFixedThreadPool(固定大小)、newCachedThreadPool(可缓存)等方法创建线程池。
ForkJoinPool:用于并行执行任务,采用“工作窃取”算法,适合将大任务拆分成小任务并行计算。
3.线程相关类:
ThreadLocal:为每个线程提供变量的独立副本,实现线程间的数据隔离。
线程安全集合:java.util.concurrent包下的集合类,如ConcurrentHashMap(支持高并发写入)、CopyOnWriteArrayList(读操作无锁,适合读多写少场景)。

浙公网安备 33010602011771号