Java 基本语法之 多线程
一、什么是 线程 ?
线程( Thread )是一个程序内部的一条执行路径。
二、多线程是什么?
多线程是指从软硬件上实现多条执行流程的技术。
三、线程创建
(一)继承Thread类
1. 定义一个子类MyThread继承线程类 java.lang .Thread,重写run()方法
2. 创建MyThread类的对象
3. 调用线程对象的start()方法启动线程(启动后还是执行run方法的)
(二)实现Runnable接口
1. 定义一个线程任务类MyRunnable实现Runnable接口,重写run()方法
2. 创建MyRunnable任务对象
3. 把MyRunnable任务对象交给Thread处理。
4. 调用线程对象的start()方法启动线程
四、常用api
五、解决线程安全问题
(一)同步代码块
作用:把出现线程安全问题的核心代码给上锁。
原理:每次只能一个线程进入,执行完毕后自动解锁,其他线程才可以进来执行。
例子:
synchronized (同步锁对象) {
操作共享资源的代码(核心代码)
}
锁对象要求:锁对象只要对于当前同时执行的线程来说是同一个对象即可。
锁对象建议:对于实例方法建议使用this作为锁对象。对于 静态方法 建议使用 字节码 (类名.class)对象作为锁对象。
(二)同步方法
作用:把出现线程安全问题的核心方法给上锁。
原理:每次只能一个线程进入,执行完毕以后自动解锁,其他线程才可以进来执行。
例子:
修饰符 synchronized 返回值类型 方法名称(形参列表) {
操作共享资源的代码
}
(三)Lock锁
为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock,更加灵活、方便。
Lock 是接口不能直接实例化,这里采用它的实现类ReentrantLock来构建Lock锁对象。
六、 线程池
线程池就是一个可以复用线程的技术。如果用户每发起一个请求,后台就创建一个新线程来处理,下次新任务来了又要创建新线程,而创建新线程的开销是很大的,这样会严重影响系统的性能。
(一)使用
JDK 5.0起提供了代表线程池的接口:ExecutorService。
方式一:使用ExecutorService的实现类ThreadPoolExecutor自创建一个线程池对象
方式二:使用Executors(线程池的工具类)调用方法返回不同特点的线程池对象