一:线程的创建
1:编写一个继承Thread类的类,然后在后面重写Thread类的run()方法。
步骤
a 创建一个继承Thread的类
b在创建的Thread子类中重写run()方法
c 创建Thread子类的实例
d通过调用该实例上的run()方法
2:编写一个类实现Runable接口
a 创建一个实现Runable接口
b在IanyRunable实现接口的类中实现run()方法
c创建一个Runable类的实例
d创建一个Thread类,讲Runable的实例作为构造器参数传进去
e通过调用Thread类的实例start()方法
二:线程的生命周期
生命周期有几个状态
新状态:线程对象已经创建,还没有在其上调用start()方法。
可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。
运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。
等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到可运行状态。
死亡态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
线程睡眠 sleep(): 执行该方法可是当前的线程停止运行若干毫秒,线程由运行状态进入不可运行状态,睡眠时间过后继续进入可运行状态。
三:解决线程同步的问题
1 使用同步块 synchronized(取的锁的对象){
}
2 使用synchronized的方法。
四:线程之间通过wait(),notify(),notifyAll()方法通信。