一、线程的五种状态
二、线程的4种创建方式
1)继承Thread类
2)实现Runnable接口
3)实现callable接口
4)线程池
线程实现方法 | 调用方法 | 返回值 | 异常 | 是否能取消 |
继承Thread | Thread t = new Threa(); t.start(); | 无 | 不能 | 不能 |
实现Runnable | Thread t=new Thread(New Runnable()); t.start(); | 无 | 不能 | 不能 |
实现Callable | FutureTask ft = new FutureTask(New Callable()); Thread t = new Thread(ft); t.start(); String name = ft.get();(此方法会阻塞主线程) | 有 | 能 | 能(ft.cancel()) |
线程池 |
|
|
|
|
总结 | 一般使用实现Runnable的方式,原因如下:
|
|
总结:没有返回值的要求,一般使用实现Runnable接口
三、线程的同步方式
1、同步代码块(synchrozied)
2、同步方法(synchrozied)
3、重入锁(ReenreantLock)
四、线程死锁
多个线程抢占共享资源而造成的僵局。
1、死锁的必备条件
1)资源互斥
2)不可剥夺条件
3)保持与请求
4)循环等待
2、解决死锁的方法
破坏死锁必备条件;但是一般不会破坏互斥条件。
五、线程的通信方式
1、线程通信的背景
CPU默认把时间片随机分配给线程执行,现在我们需要按照自己的顺序执行。
2、线程通信的四种方式
1)等待唤醒方式
a、Object的wait、notify、notifyAll方法(必须配合sychrozide使用)
b、Condition的await、signal、signalAll(必须配合ReenrantLock使用)
2)CountDownLatch(计数器)
一个线程必须等到其他线程执行完了在执行的。
3)CyclicBarrier(基于ReenrantLock与Condition实现的)
多个线程等到同一个状态再一起执行。
4)Semaphore
用于控制对某组线程的访问权限。
六、总结
1、wait与sleep比较
类别 | 同步 | 作用对象 | 释放锁资源 | 唤醒条件 | 方法属性 |
wait | 需要 | 作用Object对象本身 | 释放 | notify | 实例方法 |
sleep | 不需要 | 作用当前线程 | 不释放 | 超时或调用interrupt方法 | 静态方法 |