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

1. sleep方法

public static void sleep(long millis) throws InterruptedException

使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。 线程不会丢失任何显示器的所有权。
参数 millis - 以毫秒为单位的睡眠时间长度
异常 IllegalArgumentException - 如果 millis值为负数
InterruptedException - 如果任何线程中断当前线程。 当抛出此异常时,当前线程的中断状态将被清除。
下面将使用sleep方法使线程暂停指定的秒数(两秒)
 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); 该方法的参数值要有效(不能为负数),否则会抛出异常。

2. join方法

public final void join() throws InterruptedException

等待这个线程死亡。
异常 InterruptedException - 如果任何线程中断当前线程。 当抛出此异常时,当前线程的中断状态将被清除。
下例是当myThread1死亡之后才执行其它线程,还未死亡之前是不能执行其它任何线程的。
 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 }

测试结果:

3. setDaemon

public final void setDaemon(boolean on)

将此线程标记为daemon线程或用户线程。 当运行的唯一线程都是守护进程线程时,Java虚拟机将退出。

线程启动前必须调用此方法。

参数 on - 如果 true ,将此线程标记为守护线程
异常
IllegalThreadStateException - 如果这个线程是 alive
SecurityException - 如果 checkAccess()确定当前线程不能修改此线程  
 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 }

测试结果:

public final boolean isDaemon()

测试这个线程是否是守护线程。
结果  
true:如果这个线程是一个守护线程;
false:不是守护线程
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());

测试结果:

Thread线程控制之sleep、join、setDaemon方法的用处的更多相关文章

  1. Java Thread线程控制

    一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...

  2. java 之Thread线程相关yield()、sleep()、wait()、join()、run和start方法详解

    1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...

  3. Thread线程join方法自我理解

    Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...

  4. python threading queue模块中join setDaemon及task_done的使用方法及示例

    threading:     t.setDaemon(True)  将线程设置成守护线程,主进行结束后,此线程也会被强制结束.如果线程没有设置此值,则主线程执行完毕后还会等待此线程执行.     t. ...

  5. 线程中的setDaemon方法

    setDaemon方法必须在start方法前定义.t1.setDaemon(True),该语句的意思是:将主线程A设置为子线程t1的守护线程.也就是在执行程序时,t1会随着主线程A的退出而退出,不论t ...

  6. python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)

    python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon) 前言 今天小编YOYO请xiaoming和xiaowang吃火锅,吃完火锅的时候会有以下三种场景: - ...

  7. python多线程中join()方法和setDaemon()方法的区别

    """ join()方法:主线程A中,创建了子线程B,并且在主线程中调用了B.join()方法,那么主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行 ...

  8. C# Thread.Join的报错情形——论执行完的线程能够成功执行Join吗

    结论: 能, 执行完的线程调用Join不会抛出错误. Thread.Join()是什么? Join()函数用于阻塞地等待线程结束, 其行为是在线程A中调用了线程B的Join()后, 线程A将一直阻塞在 ...

  9. 面经手册 · 第20篇《Thread 线程,状态转换、方法使用、原理分析》

    作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...

随机推荐

  1. Jenkins环境搭建(8)-邮件未能正常发送

    昨天,在使用jenkins构建项目时,出现了个问题,问题是:jenkins控制台日志显示邮件发送成功,但实际没有成功. 此前,jenkins的配置,项目构建后,是能正常发送邮件的,可这次突然就不行了, ...

  2. 个人介绍&软工5问

    个人简历:   姓名:温海源 性别:男 专业:软件工程 学校:广东工业大学 技术能力:掌握C语言 JAVA在学 证书:CET4,CET6 联系方式:1424315382@qq.com 软工5问: 1. ...

  3. When you received Ubuntu...

    翻译软件 Goldendict 安装命令: sudo apt install goldendict 在 dit -> Dictinoaries -> Websites 中添加有道的链接: ...

  4. NOI Online #3 提高组 游记

    考的好就来写游记吧 2020.5.24 星期日 上一天晚上为了班里事物做 PPT 肝到 11:30,这比赛就打打玩玩.第二天醒来有点昏昏沉沉的感觉. 打开题面,一看 T1,好像是个性质极其简单的前缀和 ...

  5. sudo rm -rf /*含义

    sudo -----  管理员权限 rm ------ remove 移除 rf ------ recursive递归  force强制 /* ------ 目录下所有文档

  6. 微信小程序图片保存到本地

    微信小程序图片保存到本地是一个常用功能: 这里讲解下完整实现思路: 因为微信官方的授权只弹一次,用户拒绝后再次调用,就需要结合button组件的微信开放能力来调起,以下方案在微信各种授权中可参考. w ...

  7. C#知识结构

    C#知识结构 对于一个工作多年的程序员而言,接口.反射.索引器.事件.委托这些耳熟能详的词汇,提起来别说多简单了,但是让老司机坐在那一个人拿起一支笔,把脑海中对C#知识结构进行梳理一下,大抵是写不了多 ...

  8. angular8 在componet里面跳转新的地址页面

    this.router.navigate(['/teacher/course/detail/' + id]);

  9. 第九章 Nacos Config--服务配置

    今天咱们接着 上一篇 第八章 SMS–短信服务 继续写 SpringCloud Alibaba全家桶 -> 第九章 Nacos Config–服务配置,废话不多说,开干 9.1 服务配置中心介绍 ...

  10. 第四章 Sentinel--服务容错

    我们接着承接上篇继续讲下去 : 第三章 Nacos Discovery–服务治理,开始第四篇的学习 第四章 Sentinel–服务容错 4.1 高并发带来的问题 在微服务架构中,我们将业务拆分成一个个 ...