因为cup 的时间片轮转机制,使得线程start () 后进入就绪状态,等待cpu分配好时间在运行。
yield();将线程从运行转到就绪状态 ,让出cpu时间片,但不会释放锁。//类似于重新排队
join();//类似于插队加入,将join()的线程,放到当前要执行的位置,直到该线程执行完,才会再次执行其他线程。
notify():通知一个在对象上等待的线程,使其从wait()方法返回,而返回的前提是该线程获取到了对象锁,没有获得锁的线程重新进入waiting状态
notifyAll(): 通知所有等待在对象上的线程
wait():调用该方法的线程进入 waiting 状态,只有等待另外的线程通知或被中断才会返回,需要注意,调用wait()方法后,会释放对象的锁
wait(long):超时等待一段时间,这里的参数时间是毫秒,如果没有通知就超时返回,
wait(long,int):对于超时时间可以更细粒度烦的控制,可以达到纳秒
等待和通知的标准:
01获取对象锁
02如果条件不满足,那么对象的wait()方法,被通知后仍要检查条件。
03条件满足则执行对应的逻辑。
synchronized(对象){
while(条件不满足){
对象.wait();
}
}
在通过 wait()、notify()系列方法之前,线程必须要获得该对象的对象级别锁,即只能在同步方法或同步快中调用wait()方法、notify()系列方法,进入wait()方法后,当前线程释放锁,再从wait()前,线程与其他线程竞争获得锁,执行notify()系列方法的线程推出了调用了notifyAll 的synchronized代码块后,他们就会竞争。如果其中的一个线程获得了该对象的锁,他就会执行下去,当他退出代码块时,再释放锁,其他所有被唤醒烦人线程再竞争,直至所有被唤醒的线程都被执行完毕。
线程的优先级
useThread.setPriority(num); //默认为5,(1~10 一般为)理论上有用
设置线程优先级时,针对频繁阻塞(休眠或者I/O操作)的线程需要设置高优先级,而计算较多、用时较多的线程优先级应设置较低,确保处理器不会被独占。
守护线程 :被用作完成和支持工作,内存回收 等等被动启动的内部线程。
当主线程结束,守护线程也会结束。设置方法://useThread.setDaemon(true);
主线程结束, 守护线程中 finally 也不一定会执行。看时间片是否会分配