多线程
进程:应用程序。出于运行过程中的程序,并且具有一定的独立功能,,是系统资源分配和调度的最小单元。
线程:一个或多个。
并行:在同一时刻,有多条指令在多个处理器上同时执行。
并发:在同一时间间隔,多个进程指令被快速轮换执行。
抢占式多任务操作策略
一、创建线程启动
1、继承thread类创建线程类
定义thread类的子类,并重写该类的run()方法,该run()方法的方法体 线程执行体。
2、实现runable接口创建线程类
3、匿名内部类
二、线程生命周期
1、新建状态
用new关键字和thread类极其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间。通过调用start方法进入就绪状态。
注意:不能对已经启动的线程再次调用start方法。
2、就绪状态
出于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,出于线程就绪队列。一旦获得CPU,线程就进入运行状态,并自动调用自己的run方法。
3、运行状态
可以变成阻塞状态、就绪状态、死亡状态。
4、阻塞状态
出于运行状态的线程在某些情况下,如执行了(sleep)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入阻塞状态。
5、死亡状态
当线程的run方法执行完,或者被强制性的终止,就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死去,就不会复生。如果在一个死去的线程上调用start()方法,会抛出异常。
三、线程管理
1、线程睡眠(sleep)
线程暂停,并进入阻塞状态,通过调用thread类的静态sleep()方法来实现
2、线程让步(yield)
yield()和sleep()方法比较相似,它也thread类提供的一个静态的方法。它也可以让当前正在执行的线程停止,让出CPU资源给其他线程。
3、线程合并(join)
thread提供了让一个线程等待另一个线程完成的方法––join()方法。
4、设置线程优先级
MAX_PRIORITY、MIN_PRIORITY、NORM_PRIORITY三个静态常量来设定优先级。
5、后台(守护、精灵)线程
为其他线程提供服务
如果所有的前台线程都死亡,后台线程会自动死亡
6、正常结束线程
四、线程同步
1、同步代码块
Synchronized 互斥访问
格式:synchronized(同步锁){
需要同步操作的代码
}
2、同步方法
同步锁:对于非static方法,同步锁就是this
对于static方法,我们使用当前方法所在类的字节码对象(类名.class)
3、锁机制=lock(同步锁)
public void lock():加同步锁
public void unlock():释放同步锁
五、线程通信
1、等待唤醒机制:wait notify notifyAll
2、
3、
六、线程池
顶级接口:java.util.concurrent.Executor
创建线程池:public static ExecutorService newFixedThreadPool(int nThreads)
步骤:⑴、创建线程池对象
⑵、创建runable接口子类对象(tack task)
⑶、提交runable接口子类对象
⑷、关闭线程池(一般不做)
七、死锁
死锁的四个条件:
1、互斥条件。资源不能被共享,只能被同一个进程使用。
2、请求与保持条件。已经得到资源的进程可以申请新的资源。
3、非剥夺条件。已经分配的资源不能从相应的进程中被强制剥夺。
4、循环等待条件。
八、线程相关类