并发与并行
- 并发:指两个或多个事件在同一个时间段内发生
- 并行:指两个或多个事件在同一时刻发生(同时发生)
进程与线程
- 进程:是指一个内存中运行的应用程序
- 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行
Thread类中的常用方法
String getName()返回该线程的名称
static Thread currentThread()返回对当前正在执行的线程对象的引用
void setName(String name)改变线程的名称,使之与参数name相同
Thread(String name)调用父类的带参构造方法,把线程名称传递给父类
public static void sleep(long millis)使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)
多线程实现步骤
第一种
- 创建一个Thread类的子类
- 在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程要做什么)
- 创建Thread类的子类对象
- 调用Thread类中的方法start方法,开启新的线程,执行run方法
第二种
- 创建一个Runnable接口的实现类
- 在实现类中重写Runnable接口的run方法,设置线程任务
- 创建一个Runnable接口的实现类对象
- 创建Thread类对象,构造方法中传递Runnable接口的实现类对象
- 调用Thread类中的start方法,开启新的线程执行run方法
解决线程安全问题
1.同步代码块
synchronized(锁对象){
可能会出现线程安全问题的代码(访问了共享数据的代码)
}
注意
1. 通过代码块中的锁对象,可以使用任意的对象
2. 但是必须保证多个线程使用的锁对象是同一个
3. 锁对象作用:把同步代码块锁住,只让一个线程在同步代码块中执行
2.同步方法
格式:定义方法的格式
修饰符 synchronized 返回值类型 方法名(参数列表){
可能会出现线程安全问题的代码(访问了共享数据的代码)
}
同步方法也有锁对象,就是实现类this
静态同步方法的锁对象为本类的class属性
3.Lock锁
Lock接口中的方法:
void Lock()获取锁
void unLock()释放锁
使用步骤:
1.在成员位置创建一个ReentrantLock
2.在可能出现安全问题的代码前调用Lock接口中的方法Lock获取锁
3.在可能出现安全问题的代码后调用Lock接口中的方法unLock释放锁
线程状态
进入到TimeWaiting(计时等待)有两种方式
1.sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态
2.wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable/Blocked状态
唤醒方法:
void notify()唤醒在此对象监视器上等待的单个线程
void notifyAll()唤醒在此对象监视器上等待的所有线程
线程间通信
概念:多个线程在处理用一个资源,但是处理的动作(线程的任务)却不同
线程池
就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源
合理利用线程池的好处
- 降低资源消耗,减少了创建和销毁线程的次数
- 提高响应速度,当任务到达时,任务可以不需要等到线程创建就能立即执行
- 降低线程的可管理性,可以根据系统的承受能力,调整线程池中的数目,防止内存消耗过多
import java.util.concurrent.Executors;线程池的工厂类,用来生成线程池
Executors类中的静态方法:
static ExecutorService newFixedThreadPool(int nThreads)创建一个可重用固定线程数的线程池
参数表示线程池中线程的数量
返回值返回的是ExecutorService接口的实现类对象
import java.util.concurrent.ExecutorService;线程池接口
用来从线程池中获取线程,调用start方法,执行线程任务
Future<?> submit(Runnable task)提交一个Runnable任务用于执行(返回的Future什么东西不是很懂)
void shutdown()关闭/销毁线程池的方法
线程池的使用步骤:
- 使用线程池的工厂类Executors里边提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池
- 创建一个类,实现Runnable接口,重写run方法,设置线程任务
- 调用ExecutorService中的方法submit,传递线程任务(实现类),开启线程,执行run方法
- 调用ExecutorService中的方法shutdown销毁线程池(不建议)