Thread类构造方法
- 创建Thread对象,默认有一个线程名,以Thread-开头,按序增加的数字,从0开始
- 如果在构造Thread的时候没有传递Runnable或者没有复写Thread的run方法,该Thread不会执行任何东西。
- 如果构造Thread对象是没有传入ThreadGroup,则默认获取父线程的group作为当前线程的group。此时子线程和父线程在同一个group中
- stackSize可以指定线程的栈的大小,如果没有指定stackSize默认是0,0代表忽略该参数。该参数由JVM使用。注意:该参数有些平台无效,一般通过
-Xss 10M
设置栈的大小
Thread类常用构造方法
Thread()
Thread(String name)
Thread(Runnable target)
Thread(Runnable target, String name)
Thread(ThreadGroup group, String name)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name,long stackSize)
守护线程
通过thread.setDaemon(true);
设置守护线程;伴随着非守护线程结束和结束。主要作为辅助功能使用。
- 必须在调用start方法前设置线程为守护线程
Thread的join方法详解
join
方法的作用:等待当前线程执行完成。还有两个重载方法:
join(long millis)
等待指定的时间,单位毫秒join(long millis, int nanos)
和上面的方法类似,只是在毫秒的基础上在加了纳秒。更加精确
Thread t1 = new Thread(() -> {
IntStream.range(1, 1000).forEach(i -> System.out.println(Thread.currentThread().getName() + "->" + i));
});
Thread t2 = new Thread(() -> {
IntStream.range(1, 1000).forEach(i -> System.out.println(Thread.currentThread().getName() + "->" + i));
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("All of done");
IntStream.range(1, 1000).forEach(i -> System.out.println(Thread.currentThread().getName() + "->" + i));
t1和t2线程交替执行。
main线程等待t1、t2执行完再执行
Thread的interrupt方法
可以对调用者的线程中断,设置中断标记。并且在调用wait()、join()、sleep()
方法的时候会抛出InterruptedException
,如果捕捉了该异常则中断标记将被清除。
Thread t = new Thread(() -> {
while (true) {
}
});
t.start();
Thread.sleep(100);
System.out.println(t.isInterrupted());
t.interrupt();
Thread.sleep(200);
System.out.println(t.isInterrupted());
输出结果
false
true
捕获异常
Thread t = new Thread(() -> {
while (true) {
try {
Thread.sleep(100);
}