1. 线程的创建
- 创建一个Thread类,或者一个Thread子类的对象
- Thread是一个线程类,位于java.lang包下
- Thread() 创建一个线程对象
- Thread(String name) 创建一个具有指定名称的线程对象
- Thread(Runnable target) 创建一个基于Runnable接口实现类的线程对象
- Thread(Runnable target, String name) 创建一个基于Runnable接口实现类,并且具有指定名称的线程对象
- 常用方法
- public void run() 线程相关的代码写在该方法中,一般需要重写
- public void start() 启动线程的方法
- public static void sleep(long m) 线程休眠m毫秒的方法
- public void join() 优先执行调用join()方法的线程
- 创建一个实现Runnable接口的类的对象
- 只有一个方法run()
- Runnable是Java中用以实现线程的接口
- 任何实现线程功能的类都必须实现该接口
2. 线程的状态和生命周期
- 线程的状态
- 新建(New)
- 可运行(Runnable)
- 正在运行(Running)
- 阻塞(Blocked)
- 终止(Dead)
- 线程的生命周期
- 新建New
- 调用start()进入可运行Runnable
- 调用stop()进入终止Dead
- 可运行Runnable
- 获取cpu使用权进入正在运行Running
- 调用stop()进入终止Dead
- 正在运行Running
- 时间片用完yield()进入可运行Runnable
- 调用join()、wait()、sleep()、I/O请求进入阻塞Blocked
- 线程执行完毕或异常终止、或调用stop()进入Dead
- 阻塞Blocked
- 等待调用join()的线程执行完毕
- notify()或nofifyAll()
- sleep超时
- I/O请求完成
- 调用stop()进入Dead
3. sleep方法应用
- Thread类的方法
- public static void sleep(long millis)
- 作用是在指定的毫秒数内让正在执行的线程休眠(暂停执行)
4. join方法应用
- Thread类的方法
- public final void join()
- public final void join(long millis)
- 作用是等待调用该方法的线程结束后才能执行
5. 线程优先级
- Java为线程类提供了10个优先级
- 优先级可以用整数1-10表示,超过范围会抛出异常
- 主线程默认优先级为5
- 优先级常量
- MAX_PRIORITY 线程的最高优先级10
- MIN_PRIORITY 线程的最低优先级1
- NORM_PRIORITY 线程的默认优先级5
- 优先级相关的方法
- public int getPriority() 获取线程优先级的方法
- public void setPriority(int newPriority) 设置线程优先级的方法
6. 多线程运行问题
- 各个线程是通过竞争CPU时间而获得运行机会的
- 各线程什么时候得到CPU时间、占用多久是不可预测的
- 一个正在运行着的线程在什么地方被暂停是不确定的
- 银行存取款问题
- 为了保证在存款或取款的时候,不允许其他线程对账户余额进行操作
- 需要将Bank对象进行锁定
- 使用关键字synchronized实现,可以用在三个地方
- 成员方法 public synchronized void saveAccount()
- 静态方法 public static synchronized void saveAccount()
- 语句块 synchronized(obj) {...}
7. 线程间通信
- wait()方法 中断方法的执行,使线程等待
- notify()方法 唤醒处于等待的某一个线程,使其结束等待
- notifyAll()方法 唤醒所有处于等待的线程,使它们结束等待