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 沉淀.分享.成长,让自己和他人都能有 ...
随机推荐
- SQL数据库优化的六种方法
SQL命令因为语法简单.操作高效受到了很多用户的欢迎.但是,SQL命令的效率受到不同的数据库功能的限制,特别是在计算时间方面,再加上语言的高效率也不意味着优化会更容易,所以每个数据库都需要依据实际情况 ...
- 结对项目Myapp
·Github地址:https://github.com/Dioikawa/Myapp ·成员:陈杰才(3118005089) 蔡越(3118005086) ·耗费时间估计: PSP2.1 Perso ...
- 7、Spring Cloud Hystrix
1.Spring Cloud Hystrix简介 (1).分布式问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败. 多个微服务之间调用的时候,假设微服务A调 ...
- STL——容器(List)List 的概念
1. List 容器的基本概念 1. list 是一个双向链表容器,可高效的进行插入删除元素,他的原理在于每个元素都有两个指针来记录前后两个元素的地址,像火车车厢一样,list 中各个元素在物理存储单 ...
- C++ 虚函数表与多态 —— 虚函数表的内存布局
C++面试经常会被问的问题就是多态原理.如果对C++面向对象本质理解不是特别好,问到这里就会崩. 下面从基本到原理,详细说说多态的实现:虚函数 & 虚函数表. 1. 多态的本质: 形 ...
- Java中CAS原理分析(volatile和synchronized浅析)
CAS是什么? CAS英文解释是比较和交换,是cpu底层的源语,是解决共享变量原子性实现方案,它定义了三个变量,内存地址值对应V,期待值E和要修改的值U,如下图所示,这些变量都是在高速缓存中的,如果两 ...
- docker(专业版) 安装过程报错
1.安装docker Desktop时遇到的错误 1.1安装Docker Desktop报错:WSL 2 installation is incomplete 解决: # 更新版本 https://b ...
- mysql 查询 添加 删除 语句
1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数据的 d ...
- windows宿主机访问ubuntu虚拟机中的docker服务
查看docker容器地址和虚拟机地址 windows主机中添加路由 #route -p add 172.17.0.0 mask 255.255.0.0 虚拟机地址 route -p add 172.1 ...
- [日常摸鱼]JSOI2008最大数
校运会的时候随手抽的题- 一句话题意 维护一个序列,初始为空,要求滋兹: 1.查询这个序列末尾$x$个数的最大值 2.设上一次查询的答案为$t$(如果还没查询$t=0$),在末尾插入一个数$(x+t) ...