Thread线程控制之sleep、join、setDaemon方法的用处

Thread线程控制之sleep、join、setDaemon方法的用处

  1. sleep方法
java 复制代码
public static void sleep(long millis) throws InterruptedException

使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。 线程不会丢失任何显示器的所有权。

java 复制代码
参数 millis - 以毫秒为单位的睡眠时间长度
异常 IllegalArgumentException - 如果 millis值为负数
InterruptedException - 如果任何线程中断当前线程。 当抛出此异常时,当前线程的中断状态将被清除。

下面将使用sleep方法使线程暂停指定的秒数(两秒)

java 复制代码
 1 package com.tianjh.thread;
 2 
 3 
 4 /**
 5  * Created on 2021/1/11
 6  * 定义一个类MyThread继承Thread类
 7  * 在MyThread类中重写run()方法
 8  *
 9  * @author tianjh
10  */
11 public class MyThread extends Thread {
12 
13     public MyThread() {
14     }
15 
16     public MyThread(String name) {
17         /*
18          * 调用父类的带参构造方法
19          * public Thread(String name) {
20          *     init(null, null, name, 0);
21          *  }
22          */
23         super(name);
24     }
25 
26     @Override
27     public void run() {
28         for (int i = 0; i < 10; i++) {
29             // Thread类的getName()方法: 返回此线程的名称
30             System.out.println(getName() + ":" + i);
31             try {
32                 // 使线程停留两秒之后在执行
33                 Thread.sleep(2000);
34             } catch (InterruptedException e) {
35                 e.printStackTrace();
36             }
37         }
38     }
39 
40     public static void main(String[] args) {
41         // 1.创建MyThread类的对象
42         MyThread myThread1 = new MyThread("线程1");
43         MyThread myThread2 = new MyThread("线程2");
44         MyThread myThread3 = new MyThread("线程3");
45 
46         // 2.启动线程
47         myThread1.start();
48         myThread2.start();
49         myThread3.start();
50 
51     }
52 }

Thread.sleep(-2000); 该方法的参数值要有效(不能为负数),否则会抛出异常。

  1. join方法
java 复制代码
public final void join() throws InterruptedException

等待这个线程死亡。

异常 InterruptedException - 如果任何线程中断当前线程。 当抛出此异常时,当前线程的中断状态将被清除。

下例是当myThread1死亡之后才执行其它线程,还未死亡之前是不能执行其它任何线程的。

java 复制代码
1 package com.tianjh.thread;
 2 
 3 
 4 /**
 5  * Created on 2021/1/11
 6  * 定义一个类MyThread继承Thread类
 7  * 在MyThread类中重写run()方法
 8  *
 9  */
10 public class MyThread extends Thread {
11 
12     public MyThread() {
13     }
14 
15     public MyThread(String name) {
16         super(name);
17     }
18 
19     @Override
20     public void run() {
21         for (int i = 0; i < 10; i++) {
22             System.out.println(getName() + ":" + i);
23         }
24     }
25 
26     public static void main(String[] args) {
27         // 1.创建MyThread类的对象
28         MyThread myThread1 = new MyThread("线程1");
29         MyThread myThread2 = new MyThread("线程2");
30         MyThread myThread3 = new MyThread("线程3");
31 
32         // 2.启动线程
33         myThread1.start();
34         try {
35             // 等待myThread1线程死亡,只有当该线程死亡之后才能继续执行其它线程
36             myThread1.join();
37         } catch (InterruptedException e) {
38             e.printStackTrace();
39         }
40         myThread2.start();
41         myThread3.start();
42 
43     }
44 }
  1. setDaemon
java 复制代码
public final void setDaemon(boolean on)

将此线程标记为daemon线程或用户线程。 当运行的唯一线程都是守护进程线程时,Java虚拟机将退出。线程启动前必须调用此方法。

java 复制代码
参数 on - 如果 true ,将此线程标记为守护线程
异常
IllegalThreadStateException - 如果这个线程是 alive
java 复制代码
SecurityException - 如果 checkAccess()确定当前线程不能修改此线程 
java 复制代码
1 package com.tianjh.thread;
 2 
 3 
 4 /**
 5  * Created on 2021/1/11
 6  * 定义一个类MyThread继承Thread类
 7  * 在MyThread类中重写run()方法
 8  *
 9  */
10 public class MyThread extends Thread {
11 
12     public MyThread() {
13     }
14 
15     public MyThread(String name) {
16         super(name);
17     }
18 
19     @Override
20     public void run() {
21         for (int i = 0; i < 100; i++) {
22             System.out.println(getName() + ":" + i);
23         }
24     }
25 
26     public static void main(String[] args) {
27         // 1.创建MyThread类的对象
28         MyThread myThread1 = new MyThread("线程1");
29         MyThread myThread2 = new MyThread("线程2");
30 
31         // 设置当前main为主线程
32         Thread.currentThread().setName("主线程");
33 
34         /*
35          * 设置为守护线程
36          * 当运行的剩余线程都是守护进程线程时,Java虚拟机将退出。
37          * 也就是当main线程执行完之后就只剩myThread1、myThread2线程了,它们都是守护线程,
38          * 所以此时JVM会退出,也就不再继续执行其它线程了
39          * 线程启动前必须调用setDaemon()方法
40          */
41         myThread1.setDaemon(true);
42         myThread2.setDaemon(true);
43 
44         // 2.启动线程
45         myThread1.start();
46         myThread2.start();
47 
48         // 让主线程执行10次
49         for (int i = 0; i < 10; i++) {
50             System.out.println(Thread.currentThread().getName() + ":" + i);
51         }
52 
53     }
54 }
java 复制代码
public final boolean isDaemon()
测试这个线程是否是守护线程。
结果  
true:如果这个线程是一个守护线程;
false:不是守护线程。
java 复制代码
1         myThread1.setDaemon(true);
2         myThread2.setDaemon(true);
3 
4         // 2.启动线程
5         myThread1.start();
6         myThread2.start();
7 
8         System.out.println("myThread1线程是否为守护线程? "+myThread1.isDaemon());
复制代码
 

 
相关推荐
wrx繁星点点2 分钟前
事务的四大特性(ACID)
java·开发语言·数据库
不写八个9 分钟前
Python办公自动化教程(005):Word添加段落
开发语言·python·word
IT学长编程10 分钟前
计算机毕业设计 Java酷听音乐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·音乐系统·计算机毕业设计选题
HEX9CF14 分钟前
【CTF Web】Pikachu xss之href输出 Writeup(GET请求+反射型XSS+javascript:伪协议绕过)
开发语言·前端·javascript·安全·网络安全·ecmascript·xss
IT学长编程27 分钟前
计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·毕业论文·协同过滤算法·计算机毕业设计选题·个性化音乐推荐系统
小小娥子32 分钟前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存
赵荏苒39 分钟前
Python小白之Pandas1
开发语言·python
几何心凉39 分钟前
已解决:org.springframework.web.HttpMediaTypeNotAcceptableException
java
丶Darling.40 分钟前
代码随想录 | Day26 | 二叉树:二叉搜索树中的插入操作&&删除二叉搜索树中的节点&&修剪二叉搜索树
开发语言·数据结构·c++·笔记·学习·算法
华农第一蒟蒻42 分钟前
Java中JWT(JSON Web Token)的运用
java·前端·spring boot·json·token