五. 守护线程 setDaemon()
守护线程指的就是, 即使 Main 线程结束了, 此线程仍然会继续运行。
五.一 设置守护线程
@Test public void read3Test() throws Exception{ Read3Runnable readRunnable=new Read3Runnable(); Thread thread=new Thread(readRunnable); System.out.println("判断是否启动:"+thread.isAlive()); System.out.println("是否是守护线程:"+thread.isDaemon()); //在开启之前设置 thread.setDaemon(true); thread.start(); System.out.println("是否启动:"+thread.isAlive()); System.out.println("是否是守护线程:"+thread.isDaemon()); } class Read3Runnable implements Runnable{ @Override public void run() { System.out.println("获取线程的名称:"+Thread.currentThread().getName()); } }
运行程序,控制台打印输出:
五.二 守护线程
@Test public void daemonTest() throws Exception{ DaemonRunnable daemonRunnable=new DaemonRunnable(); Thread thread=new Thread(daemonRunnable); //先不是守护线程 //启动 // thread.setDaemon(true); thread.start(); } static class DaemonRunnable implements Runnable{ @Override public void run() { //死循环,会一直执行。 for(;;){ System.out.println("我扣"); } } }
此时运行, ,则运行一段时间之后,结束运行
如果将注释去掉,设置成守护线程的话,则会一直打印输出。
六. 线程的状态 State
线程的状态有以下几种:
1.NEW 尚未启动的线程处于此状态。
2.RUNNABLE 在Java虚拟机中执行的线程处于此状态。
3.BLOCKED 被阻塞等待监视器锁定的线程处于此状态。
4.WAITING 正在等待另一个线程执行特定动作的线程处于此状态。
5.TIMED_WAITING 正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
6.TERMINATED 已退出的线程处于此状态。
@Test public void readStateTest() throws Exception{ ReadStateRunnable readRunnable=new ReadStateRunnable(); Thread thread=new Thread(readRunnable); Thread.State state=thread.getState(); System.out.println("开启前状态:"+state); thread.start(); state=thread.getState(); System.out.println("开启后状态:"+state); } class ReadStateRunnable implements Runnable{ @Override public void run() { System.out.println("获取线程的名称:"+Thread.currentThread().getName()); } }
运行程序,控制台打印输出:
七. 线程优眠 sleep
会暂停时间。
//线程的休眠 @Test public void sleepTest(){ SleepRunnable readRunnable=new SleepRunnable(); Thread thread=new Thread(readRunnable); thread.start(); //休眠5秒, 保证后面的先不执行。 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("休眠结束,运行成功"); } class SleepRunnable implements Runnable{ @Override public void run() { try { //暂时3秒后才输出内容。 Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("输出线程名称:"+Thread.currentThread().getName()); } }