线程的构造
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread类的构造方法被重载了八次,构造方法如下:
————————————————
public Thread( );
public Thread(Runnable target);
public Thread(String name);
public Thread(Runnable target, String name);
public Thread(ThreadGroup group, Runnable target);
public Thread(ThreadGroup group, String name);
public Thread(ThreadGroup group, Runnable target, String name);
public Thread(ThreadGroup group, Runnable target, String name, long stackSize);
————————————————
守护线程
守护线程是一类比较特殊的线程,一般用于处理一些后台的工作,比如jdk的
垃圾回收线程。
1.设置守护线程很简单,调用setDaemon方法即可,true代表守护线程,false代表正常线程。
2.isDaemon方法可以判断一个线程是否是守护线程。
3.setDaemon方法只能在线程启动之前才能生效,一个线程已经死亡再调用setDaemon 会抛出IllegalThreadStateException。
package day0518;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
import java.util.concurrent.TimeUnit;
/**
* @author liw
* @date 2020-06-16
*/
public class Demo1 {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(()->{
while (true){
try{
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("守护线程运行中");
}
}
});
thread.setDaemon(true);
thread.start();
TimeUnit.SECONDS.sleep(20);
System.out.println("主线程结束");
}
}
执行结果 20秒后主线程结束 随之守护线程也结束
守护线程运行中
守护线程运行中
守护线程运行中
守护线程运行中
主线程结束
Process finished with exit code 0
为什么会输出四次“守护线程运行中” ?。
这是因为main线程先启动了,守护线程后于它获得执行权,守护线程执行第一次时
其实main线程等待时间大于一秒,守护线程等待时间等于一秒。
故最后守护线程刚打印第四次还没来得及到第五个一秒的等待时
main线程已经结束,此时守护线程随之结束。
实验将5改成2,多执行几次你会发现有时输出两次,有时输出一次。
为啥呢?思考下。