- 线程的创建和启动
- 继承Thread类,创建线程类。改写run()方法,实例化后,启动start()
Thread.currentThread():Thread类的静态方法,该方法总是返回当前正在执行的线程对象
getName():该方法是Thread类的实例方法,该方法返回调用该方法的线程名字
- 定义Runnable接口实现类,改写run()方法,实例化后,不需要start()
但是需要new Thread(new Runnable).start() 来启动
即Thread对象来包装Runnable对象
其中Runnable线程的名字由Thread.currentThread()或getName()获取
使用继承Thread类来创建线程,多个线程之间无法共享线程类的实例变量
使用继
Runnable接口
来创建线程,多个线程之间可以共享线程类的实例变量
- 定义Callable接口实现类,改写call()方法,方法内要有返回值,实例化后。
Future接口的FutureTask类的实例化对象,来包装callable对象
Thread对象来包装FutureTask对象
调用FutureTask对象的get()方法来获取子线程执行结束后的返回值
call()方法允许抛出异常,而且允许带返回值
综上,Callable接口、Runnable接口
要绑定到当前Thread线程(Thread.currentThread()获取)
2.创建和管理线程的方法
线程池:
Executors类,ExecutorService接口
线程工厂:ThreadFactory接口
线程:
Thread
3.线程生命周期
新建(new)
就绪(Runnable)
运行(Running)
阻塞(Blocked)
死亡(Dead)
4.运行和阻塞状态
当发生如下情况,线程进入阻塞状态
(1)线程调用sleep方法
(2)线程调用了一个阻塞式的I/0方法
(3)线程试图获取一个同步监视器
(4)线程在等待某个通知(notify)
(5)程序调用了线程的suspend()方法将该线程挂起
当发生如下情况,线程进入就绪状态
(1)调用sleep()方法的线程经过了指定时间
(2)线程调用的阻塞式I/0方法已经返回
(3)线程成功地获取了同步监视器
(4)线程正在等待某个通知时,其他线程发出一个通知
(5)处于挂起状态的线程被调用了resume()恢复方法
当发生如下情况,线程进入死亡状态
(1)run()和call()执行完成,线程正常结束
(2)线程抛出一个未捕的Exception和Error
(3)直接调用stop()方法,可以会导致死锁
5.控制线程
(1)join方法,由线程调用其他线程
(2)setdaemon(true),设置后台线程;isDaemon()判断是否后台线程
(3)sleep(),线程睡眠
(4)yield(),线程让步,将该线程转为就绪状态
(5)改变线程的优先级
setPriority(int newPriority)设置优先级,getPriority()获取优先级
MAX_PRIORITY:其值为10
MIN_PRIORITY:其值为1
NORM_PRIORITY:其值为5
6.run()方法不具有同步安全性
使用同步监视器的代码块
synchronized(object)
{
}
使用同步监视器的方法
使用关键字synchronized修饰某个方法(非static方法)
7.释放同步监视器的锁定
(1)当前线程的同步代码块、同步方法执行结束
(2)当前线程的同步代码块、同步方法遇到break、return返回
(3)当前线程的同步代码块、同步方法遇到未处理的Error或Exception
(4)当前线程的同步代码块、同步方法,程序执行了同步监视器对象的wait()方法
8.线程不释放的情况
(1)当前线程的同步代码块、同步方法,程序调用sleep()或yield()
(2)当前线程的同步代码块、同步方法,其他线程调用了该线程的suspend()
9.同步锁(Lock)
ReentrantLock(可重入锁)类
private final ReentrantLock lock = new ReentrantLock();
.......
lock.lock();
.......
finally{
lock.unlock();
}
.......