一:守护线程
① 什么是守护线程?
守护线程指的是服务线程,是专门为其它线程(用户线程)服务的,当主线程停止了,守护线程也会被停止。
② 守护线程与用户线程的区别?
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);
}
}
}
结果
也有可能为以下结果 道理请理解以上逻辑