多线程
线程6中状态:
New(新生):用new操作符创建一个新线程
Runnable(可运行):一旦调用start方法,线程处于该状态
Blocked(被阻塞):当一个线程试图获取一个内部的对象锁,而改锁被其他线程持有,则该线程进入阻塞状态,当所有其他线程释放该锁,并且线程调度器允许本线程持有它的时候,该线程将变成非阻塞状态。
Waiting(等待):当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态(调用 Object.wait、Thread.join,等待java.util.concurrent库中的Lock或Contition)
Time waiting(计时等待):这一状态将一直保持到超时期满或者接收到适当的通知
Terminated(被终止):
1、因为run方法正常退出而自然死亡
2、因为一个没有捕获的异常终止了run方法而意外死亡
线程优先级:1-10优先级从低到高,缺省为5
守护线程:void setDaemo(boolean isDaemo) 该方法必须在线程启动之前调用
yeild方法导致当前线程处于让步状态,让同等级或更高的线程执行
Lock/Condition
lock/unlock:发生阻塞。锁是可重入的,锁保持一个持有计数,一个锁保护的代码可以调用另一个使用相同的锁的方法
条件对象:一个锁对象可以有一个或多个相关的条件对象,导致阻塞
Lock lock = new ReentrantLock(); //构建一个可以被用来保护临界区的可重入锁
Condition condition = lock.newCondition(); //返回一个与该锁相关的对象
lock.lock(); //获取这个锁,如果锁同时被另一个线程拥有则发送阻塞
condition.await(); //将线程放到条件的等待集中
condition.signAll(); //解除该条件的等待集中所有线程的阻塞状态
condition.signal(); //从该条件的等待集中随机地选择一个线程,解除其阻塞状态
lock.unlock(); //释放这个锁
每个对象都有一个内部锁,内部对象锁只有一个相关条件
有锁来管理那些试图进入synchronzied方法的线程,有条件来管理那些调用wait的线程
wait notifyAll notify方法是Object的final方法
stop方法导致对象处于不一致的状态,破坏了对象
suspend不会破坏对象
阻塞队列,java.util.concurrent
线程池:一个线程池包含许多准备运行的空闲线程,将Runnable对象交给线程池,就会有一个线程调用run方法,当run方法退出时,线程不会死亡,而是在池中准备下一个请求提供服务。线程池可以减少并发线程的数目