多线程
创建与启动
方式1:继承于Thread类
- 继承Thread类
- 重写run方法
- 创建对象
- 调用start方法
方式2:实现Runnable接口
- 实现Runnable接口
- 实现run方法
- 创建对象
- 将对象传入Thread类构造器中
- 通过Thread类对象调用start方法
方式3:实现Callable接口
- 实现Callable接口
- 实现call方法
- 创建对象
- 将对象传入FutureTask类构造器中
- FutureTask类调用get方法可以获取call方法的返回值
- FutureTask对象传入Thread类构造器中
- 通过Thread类对象调用start方法
方式4:线程池
ExecutorService和Executors
常用方法
- start():启动当前线程,调用当前线程的run()
- run():需要重写,将要执行的操作写在此方法中
- currentThread():静态方法,返回当前的线程对象
- getName():获取当前线程名
- setName():设置当前线程名
- yield():释放线程执行权,可能再次抢到
- join():被调用的对象线程执行
- sleep(long millisecond):静态方法,使当前线程睡眠
- isAlive():调用方法的线程是否存活
- setPriority(int newPriority):设置优先级,1到10,高优先级只是高概率执行
线程安全问题
方式1:同步代码块
synchronized(同步监视器){
//需要被同步的代码
}
//同步监视器(锁),任何对象都可以充当,多个线程必须共用同一把锁
//继承Thread类,当前类.class
//实现Runnable接口,一般用this
方式2:同步方法
在方法前加synchronized
方式3:Lock锁
- 使用ReentrantLock类创建对象
- 调用lock方法,上锁
- 调用unlock方法,解锁
线程通信
方法
-
wait():使调用的对象阻塞,并且释放锁
-
notify():唤醒一个
-
notifyAll():唤醒全部
说明
1. 必须在同步代码块或同步方法中使用
2. 调用者必须是同步监视器
3. 定义在Object类中
sleep()与wait()异同
- 相同点:一旦执行,都使当前进程阻塞
- 不同点:
- 声明位置不同:Thread类声明sleep,Object类声明wait
- 调用要求不同:sleep可以在任何地方调用,wait必须在同步代码块或同步方法中调用
- 是否释放同步监视器:sleep不释放,wait释放
网友评论