4月6日星期四
一、进程与线程
1、进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。
2、线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程,也有它自身产生、存在和消亡的过程。
3、进程的并发和并行
[1、]并行:同一时刻有多条指令在多个处理器上同时执行。
[2、]并发:同一时刻只能有一条指令执行;
4、
二、线程属性
1、状态
(1、)新建态
(2、)就绪态
(3、)运行态
(4、)中断态
(5、)死亡态
2、优先级
[1、]1-10级默认5级。
[2、] 线程的优先级可以通过setPriority(int grade)方法调整,如果参数不在1~10范围内,那么setPriority便产生一个IllegalArgumenException异常。getPriority方法返回线程的优先级。需要注意是,有些操作系统只识别3个级别:1、5和10。
[3、]当优先级高的执行完后(死亡态)才会执行低等级的线程
三、线程的创建
1、继承Thread类重写run()方法;
2、实现Runnable接口创建多线程,
[1、]首先创建实现Runnable接口的类,重写run()方法然后,创建它的对象a用作Thread类的target,通过Thread 名字=new Thread(a)实现或new Thread(a,“线程名”).start();
[2、]Thread类的作用是把run()方法包装成线程执行体。
3、使用Callable接口和Future创建线程
[1、]call()方法可以有返回值和抛出异常,是作为线程执行体被调用。
[2、]并不是Runnable接口的子接口,它的实例不能直接作为target。
[3、]Future接口可以代表Callable接口里call方法的返回值,并有一个实现类FutureTask,实现了Future和Runnable接口——可作为Thread类的target.
[4、]步骤
{1、}创建Callable接口的实现类实现call()方法线程执行体有返回值,在创建它的实例。
{2、}使用FutureTask类包装Callable对象。
{3、}FutureTask的实例作为Thread对象的target创建新线程;
{4、}可通过FutureTask类的实例的get()方法获得返回值。
四、线程的一些操作
1、sleep():等待多久在继续执行。
2、wait():该线程一旦使用就要在其他线程内通过notify()或notifyAll()通知它。
3、yield():暂停该线程的执行转换成就绪态达到让步的目的。
4、join():阻塞当前线程加入其他线程执行,先完成加入线程在完成其他线程,插队时需要抛出InterruptedException异常。
五、线程的同步和锁
1、通过关键字synchronized
[1、]同步代码块
[2、]同步方法
2、Lock锁
[1、]每次只能有一个线程对Lock对象加锁,线程开始访问共享资源前应先获得Lock对象
[2、]
[3、]通过实例的锁对象进行加锁和释放锁