一、概念
二、多线程的创建
1、继承thread,重写run方法(线程体)
2、使用线程:创建线程子类对象,对象调用start(),线程启动。(调用run(),只是普通方法的调用,并不是启动线程;调用start(),交给cup分配时间片去处理,内部会自己调用run())
3、静态代理设计模式:
真实角色(真实类):
代理角色(代理类):持有真实角色的引用(将真实类的引用作为代理类的成员变量)
二者实现相同的接口(两个类实现相同的接口):
4、使用runnable创建线程:(推荐:避免单继承的局限,便于共享资源)
类实现runnable接口+重写run() --》真实角色
启动多线程,使用静态代理(创建真实角色,创建代理角色+真实角色的引用,调用start()方法启动线程)
5、通过callable接口实现多线程
优点:相对于runnable接口,任务执行后可以返回值,可以抛出异常。
思路:(1)创建callable实现类+重写call方法
(2)借助执行调度服务ExecutorService,获得Future对象
ExecutorService ser = Executors.newFixedThreadPool(2); //创建两个线程
Future result = ser.submit(实现类对象);
(3)获得值result.get();
(4)停止服务ser.shutdownNow();
三、线程的状态:
1、五种状态
(1)新生状态
(2)就绪状态
(3)运行状态
(4)阻塞状态
(5)死亡状态
2、停止线程
(1)自然终止:线程体正常执行完毕
(2)外部干涉:
1)线程类中定义线程体使用的标识
2)线程体使用该标识
3)提供对外的方法改变该标识
4)外部根据条件调用该方法即可
3、阻塞
(1)join合并线程(写在那个线程里面就阻塞那个线程)
(2)Yield:暂停自己的线程(写在那个线程里面就阻塞那个线程)
(3)Sleep:休眠,不释放锁
1)与时间相关,倒计时
2)模拟网络延时
四、线程同步
- 同步:并发,多个线程访问同一份资源,确保资源安全 --》线程安全
- 同步块 synchronized(引用类型|this|类.class){
}
3.同步方法
五、死锁
- 生产者消费者模式(信号灯法)
使用wait(),notify()/nitifyAll()与synchronized一起使用
六、任务调度
- Timer()
- schedule(TimerTask task,Date time)
- schedule(TimerTask task,Date firstTime,long period)