1、线程的五种状态:
1、新建 new Thread()
2、就绪 thread.start()
3、运行 从就绪态获取CPU
4、阻塞 处于运行状态中的线程由于某种原因(wait(),sleep(),join(),I/O),暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。分为 等待阻塞(wait()),同步阻塞(synchronized),其它阻塞(sleep(),join(),I/O())
5、死亡 线程执行完或异常退出
2、线程的创建
1、创建一个MyThread类继承自Thread类,重写run()方法。
2、创建一个MyRunnable类实现Runnable接口,重写run()方法。
3、创建一个MyCallable类实现Callable<Object>接口,重写带返回值的call()方法。
创建FutureTask<object>类对象,使用FutureTask<object>类包装myCallable对象。
创建一个Thread类对象,以ft为target,并start该线程。
通过ft.get()获取返回值。
该部分参考自: http://www.cnblogs.com/lwbqqyumidi/p/3804883.html
3、多线程的阻塞
1、join() 使当前线程阻塞,到下一个线程执行完回来执行该线程
2、sleep() 使当前线程阻塞一定时间,此期间其它线程可以获取CPU时间
3、
setDaemon(true) 使前台进程转变为后台进程。(所有前台进程死亡后,后台进程生命周期结束)
4、setPriority(1~10) 设置优先级,10最大,1最小。正常的线程是5。 较大优先级的线程只是更有几率获取CPU时间,并非优先执行
5、yield() 线程让步,当前进程由运行转为就绪,CPU选取优先级大于等于该优先级的线程执行
该部分参考自:http://www.cnblogs.com/lwbqqyumidi/p/3817517.html
4、多线程的安全
为了避免生产者生产之前,消费者已经试图获取资源。即多个线程同事访问某个共享资源,因此,为避免线程安全问题,应该避免多线程环境下对此共享资源的并发访问。
1、同步方法
在方法前加上synchronized关键字 ,如public synchronized void run()
2、同步代码块
为了防止上锁范围过大,采用同步块锁住需要上锁的部分,obj为锁对象,一般使用共享资源。
synchronized(obj){
}
3、Lock对象同步锁
与共享对象一对一存在。
// 显示定义Lock同步锁对象,此对象与共享资源具有一对一关系
private final Lock lock = new ReentrantLock();
public void m(){
// 加锁
lock.lock();
//... 需要进行线程安全同步的代码
// 释放Lock锁
lock.unlock();
}
private final Lock lock = new ReentrantLock();
public void m(){
// 加锁
lock.lock();
//... 需要进行线程安全同步的代码
// 释放Lock锁
lock.unlock();
}
4、wait(),notify(),notifyAll()线程间通信
wait() 使当前对象阻塞,不释放资源。直到其它线程调用该同步锁对象的notify()或者notifyAll()方法唤醒此线程。
notify() 择一唤醒在该同步锁外等待的线程,此时当前线程并未释放资源,会继续执行。
notifyAll() 唤醒在该同步锁外等待的所有线程,此时当前线程并未释放资源,会继续执行。
该部分参考自:http://www.cnblogs.com/lwbqqyumidi/p/3821389.html