一:守护线程
① 什么是守护线程?
守护线程指的是服务线程,是专门为其它线程(用户线程)服务的,当主线程停止了,守护线程也会被停止。
② 守护线程与用户线程的区别?
java中有两种线程,一个是守护线程,一个是用户线程。守护线程指的是服务线程,比喻垃圾回收机制就是一个典型的服务线程,而用户线程就是应用程序自定义的线程。当主线程停止了,用户线程还会继续运行,而守护线程主线程停止了,守护线程也就停止了。
③ 守护线程案例
/** * 守护线程案例 * * @Title DaemonTest01 * @Description * @Company * @author Zheng.Zeng * @date 2018年6月12日 下午4:47:06 */
public class DaemonTest01 { public static void main (String[] args) { DaemonThread daemonThread = new DaemonThread (); // 设置线程为守护线程 daemonThread.setDaemon (true); daemonThread.start (); for (int i = 0; i < 10; i++) { try { Thread.sleep (100); } catch (Exception e) { } System.out.println ("主线程"); } System.out.println ("主线程执行完毕!"); } } class DaemonThread extends Thread { @Override public void run () { while (true) { try { Thread.sleep (100); } catch (Exception e) { } System.out.println ("子线程..."); } } }
执行结果
也有可能出现一下情况,可能有些人就会疑问这是为什么了。其实道理很简单,因为守护线程这时候已经在执行中了,正好主线程这个时候停止了。这时候这个正在执行的守护线程会执行完毕之后才会停止守护线程。
二:join()方法
作用:让其他线程变为休眠状态,直到当前线程执行完毕了释放资源之后,其他线程才能执行
案例:
/** * join方法案例 * * @Title JoinTest01 * @Description * @Company * @author Zheng.Zeng * @date 2018年6月12日 下午5:21:38 */ public class JoinTest01 { public static void main (String[] args) { JoinThread joinThread = new JoinThread (); Thread t01 = new Thread (joinThread); Thread t02 = new Thread (joinThread); t01.start (); try { // 让其他线程等待t01执行完毕才执行t02 t01.join (); } catch (InterruptedException e) { } t02.start (); } } class JoinThread implements Runnable { @Override public void run () { for (int i = 0; i < 10; i++) { System.out.println (Thread.currentThread ().getName () + "i:" + i); } } }
结果
三:优先级
在操作系统中,线程可以划分优先级,优先级较高的线程得到CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务(其实并不是这样)。在Java中,线程的优先级用setPriority()方法就行,线程的优先级分为1-10这10个等级,如果小于1或大于10,则抛出异常throw new IllegalArgumentException(),默认是5。
案例:
/** * 优先级案例 * * @Title PriorityTest * @Description * @Company * @author Zheng.Zeng * @date 2018年6月12日 下午5:35:23 */ public class PriorityTest { public static void main (String[] args) { PriorityThread priorityThread = new PriorityThread (); Thread thread1 = new Thread (priorityThread); Thread thread2 = new Thread (priorityThread); thread1.start (); //注意设置了优先级, 不是每次都会执行。 而是CPU调度才会分配 thread1.setPriority (10); thread2.start (); } } class PriorityThread implements Runnable { @Override public void run () { for (int i = 0; i < 10; i++) { System.out.println (Thread.currentThread ().getName () + "i:" + i); } } }
结果
也有可能为以下结果 道理请理解以上逻辑