先了解线程Thread的基本知识
阻塞和等待
阻塞:当一个线程A试图获取对象锁(非JUC库中的锁,即Syncronized),而该锁被线程B持有,则A线程进入阻塞状态,它的特点是使用简单,由JVM调度器来决定唤醒自己,而不需要另一个线程显式唤醒自己,不响应中断。
等待:当线程A等待线程B通知调度器一个条件时,则A进入等待状态。它的特点是需要等待另一个线程B显式唤醒自己,实现灵活,可响应中断,例如:Object.wait(),Thread.join()以及等待Lock或Condition
需要强调的是Synchronized和JUC里的lock都实现锁的功能,但线程的状态不一样,Synchronized会让线程进入阻塞状态,而JUC中Lock是用LockSupport.park()/unpark()来实现阻塞/唤醒,让线程进入等待状态,虽然两者的状态不一样,但是被唤醒后又都进入Runnable状态,结果是一样的。
Start():新启一个线程只能start一次,主要通过调用nativestart0()来实现,当启动一个线程时,意味着该线程获得了CPU执行时间
Sleep(): 相当于让线程A休眠,交出CPU,让CPU去干别的事,但是此时A如果已持有锁,是不会释放锁的,其他线程B是不能访问这个对象的
yield():也是交出cpu,让cpu去干别的事,唯一和sleep的区别是调用这个方法后,是不会让线程进去阻塞状态的,而是让线程重回就绪状态。
interrupt():简单的理解就是让线程停止。
在看interrupt()的时候,仅仅看表面的意思,没理解透,于是用下面的例子来解释下:
public class ShowLoadProcess implementsRunnable{
privatevolatile static boolean on = false;
publicstatic void main(String[] args) throws InterruptedException
{
// Thread testThread = newThread(new ShowLoadProcess(),"InterruptionInJava");
// testThread.start();
//
// System.out.println(Thread.currentThread().getName()+ " 2222");
// Thread.sleep(1000);
//
// ShowLoadProcess.on = true;
//
// testThread.interrupt();