Thread线程控制之sleep、join、setDaemon方法的用处
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)
线程启动前必须调用此方法。
- 参数
on- 如果true,将此线程标记为守护线程 - 异常
IllegalThreadStateException- 如果这个线程是 aliveSecurityException- 如果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方法的用处的更多相关文章
- Java Thread线程控制
一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...
- java 之Thread线程相关yield()、sleep()、wait()、join()、run和start方法详解
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- Thread线程join方法自我理解
Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...
- python threading queue模块中join setDaemon及task_done的使用方法及示例
threading: t.setDaemon(True) 将线程设置成守护线程,主进行结束后,此线程也会被强制结束.如果线程没有设置此值,则主线程执行完毕后还会等待此线程执行. t. ...
- 线程中的setDaemon方法
setDaemon方法必须在start方法前定义.t1.setDaemon(True),该语句的意思是:将主线程A设置为子线程t1的守护线程.也就是在执行程序时,t1会随着主线程A的退出而退出,不论t ...
- python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)
python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon) 前言 今天小编YOYO请xiaoming和xiaowang吃火锅,吃完火锅的时候会有以下三种场景: - ...
- python多线程中join()方法和setDaemon()方法的区别
""" join()方法:主线程A中,创建了子线程B,并且在主线程中调用了B.join()方法,那么主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行 ...
- C# Thread.Join的报错情形——论执行完的线程能够成功执行Join吗
结论: 能, 执行完的线程调用Join不会抛出错误. Thread.Join()是什么? Join()函数用于阻塞地等待线程结束, 其行为是在线程A中调用了线程B的Join()后, 线程A将一直阻塞在 ...
- 面经手册 · 第20篇《Thread 线程,状态转换、方法使用、原理分析》
作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...
随机推荐
- 软件测试相关术语(测试策略 && 测试方案 ....)
软件测试有几种不同的定义方法: a.软件测试是为了发现程序中的错误而执行程序的过程. b.软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计的一批测试用例,并运用这些测试用例运行程序,以 ...
- Springcloud之gateway配置及swagger集成
前言 关于引入gateway的好处我网上找了下: 性能:API高可用,负载均衡,容错机制. 安全:权限身份认证.脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制). 日志:日志记 ...
- 一个不倒翁App
- Springboot websocket学习Demo
使用的是springboot2.1.4版本 <parent> <groupId>org.springframework.boot</groupId> <art ...
- Docker 安装 Redis 需要注意的地方
Docker 安装 Redis 需要注意的地方 拉取镜像 docker pull redis 可以使用redis:xxx xxx为版本号,不写默认是latest 启动容器 无配置文件无密码: dock ...
- 【Django】django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required;
报错信息 django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required; you have 0 ...
- SpringBoot整合Swagger2详细教程
1. 简介 随着前后端分离开发模式越来越流行,编写接口文档变成了开发人员非常头疼的事.而Swagger是一个规范且完整的web框架,用于生成.描述.调用可视化的RESTful风格的在线接口文档,并 ...
- 【Unity】Unity中AR Foundation的使用
前段时间通过Unity 3d打包测试对比ARCore与ARKit环境探针的效果的过程中,在Google AR Core官网下载到了ARCore for Unity SDK,但是在苹果官网却没有找到AR ...
- Raft算法系列教程1:Leader选举
1.服务器的三种角色 Raft算法中服务器主要分为三种角色:Leader.Follower.Candidate,并且三种角色相互独立,也就是服务器在同一时间内只可能扮演其中一种角色. Leader:用 ...
- MySQL高可用(二)主备延时如何解决?
从上篇文章我们知道主备同步是依赖于 binlog,主库负责生产 binlog,备库负责消费 binlog,从而实现主备同步. 今天我们来学习一下主备同步里的一个重点的问题:主备延时. 主备延时,简单来 ...