JavaEE之线程(3)_线程的开始、中断、等待、休眠线程、线程的状态

news2024/9/28 15:19:16

前言

 在本栏的上一节(https://blog.csdn.net/2301_80653026/article/details/138500558),我们重点讲解了五种不同的创建线程的方式,我们还介绍了Tread类的常见构造方法和常见属性,在这一节中我们将会继续介绍Tread类。


一、启动一个线程 start( )

 在上一节我们讲解了如何通过覆写 run 方法创建一个线程对象,但线程对象被创建出来并不意味着线程就开始运行了。比如:

  1. 覆写 run 方法是提供给线程要做的事情的指令清单
  2. 线程对象可以认为是把 李四、王五叫过来了
  3. 而调用 start( ) 方法,就是喊一声:”行动起来!“,线程才真正独立去执行了

调用 start 方法, 才真的在操作系统的底层创建出一个线程。
Thread类中run和start的区别:

作用功能不同:
 1. run方法的作用是描述线程具体要执行的任务;
 2. start方法的作用是真正的去申请系统线程
.运行结果不同:
 1. run方法是一个类中的普通方法,主动调用和调用普通方法一样,会顺序执行一次;
 2. start调用方法后, start方法内部会调用Java 本地方法(封装了对系统底层的调用)真正的启动线程,并执行run方法中的代码,run 方法执行完成后线程进入销毁阶段

参考示例代码:

/**
 * @author Zhang
 * @date 2024/4/2915:16
 * @Description:
 */

//创建一个类,继承自Thread
class  MyThread extends  Thread{
    //这个方法就是线程的入口方法
    @Override
    public void run() {
       // System.out.println("hello Thread");
       
        while(true){
            System.out.println("hello threat");
            try {
                Thread.sleep(1000);  //休眠1000毫秒
                /**
                 * 此处必须try catch,不能throws
                 * 在这个代码中重写的是父类的run,父类的run没有throws,因此,子类方法也就不能有throws
                 */
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

    }
}

//创建线程
public class Demo1 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new MyThread();
        //start 和run都是Threat的成员
        //run只是描述了线程的入口(线程要做生么任务)
        //start 则是真正调用了系统API,在系统中创建线程,让线程再调用run
        t.start();

         while(true){
         System.out.println("hello main");
         Thread.sleep(1000);  //休眠1000毫秒
         }
    }
}

二、中断一个线程

停止一个线程主要有以下两种方式:

2.1 通过共享的标记来进行沟通

参考实例代码:

/**
 * @author Zhang
 * @date 2024/5/415:58
 * @Description:
 */
public class Demo8 {
    private  static  boolean isQuit = false;  //成员变量
    public static void main(String[] args) throws InterruptedException {
       //  boolean isQuit = false; 不能使用局部 变量
        Thread t=  new Thread(()->{
            while(!isQuit){
                //
                System.out.println("线程工作中");
                //此处的打印可以替换成任意的逻辑来表示逻辑的实际工作内容
                  try {
                       Thread.sleep(1000);
                  } catch (InterruptedException e) {
                      throw new RuntimeException(e);
                  }
              }
            System.out.println("线程作完毕");
        });
        t.start();
        Thread.sleep(5000);
        isQuit = true;
        System.out.println("设置 isQuit 为 true");

    }
}

2.2 调用interrupt( )方法来通知

 使用 Thread.interrupted() 或Thread.currentThread().isInterrupted() 代替自定义标志位。其中,Thread 内部包含了一个 boolean 类型的变量作为线程是否被中断的标记。
在这里插入图片描述
使用 thread 对象的 interrupted() 方法通知线程结束的代码参考实例:

public class ThreadDemo {
	private static class MyRunnable implements Runnable {
		@Override
		public void run() {
		// 两种方法均可以
			while (!Thread.interrupted()) {
				//while (!Thread.currentThread().isInterrupted()) {
				System.out.println(Thread.currentThread().getName()
				+ ": 别管我,我忙着转账呢!");
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				System.out.println(Thread.currentThread().getName()
				+ ": 有内鬼,终止交易!");
				// 注意此处的 break
				break;
				}
			}
			System.out.println(Thread.currentThread().getName()
	+ ": 啊!险些误了大事");
		}
	}
------------------------------------------------------------------
	public static void main(String[] args) throws InterruptedException 		{
		MyRunnable target = new MyRunnable();
		Thread thread = new Thread(target, "李四");
		System.out.println(Thread.currentThread().getName()
		+ ": 让李四开始转账。");
		thread.start();
		Thread.sleep(10 * 1000);
		System.out.println(Thread.currentThread().getName()
		+ ": 老板来电话了,得赶紧通知李四对方是个骗子!");
		thread.interrupt();
		}
}

thread 收到通知的方式有两种:

  1. 如果线程因为调用 wait/join/sleep 等方法而阻塞挂起,则以InterruptedException 异常的形式,清除中断标志。

当出现 InterruptedException 的时候, 要不要结束线程取决于 catch 中代码的写法, 可以选择忽略这个异常, 也可以跳出循环结束线程

  1. 否则,只是内部的一个中断标志被设置,thread 可以通过

Thread.interrupted() 判断当前线程的中断标志被设置,清除中断标志
Thread.currentThread().isInterrupted() 判断指定线程的中断标志被设置,不清除中断标志

/**
 * @author Zhang
 * @date 2024/5/416:27
 * @Description:
 */
public class Demo9 {

    public static void main(String[] args)  {
        Thread t = new Thread(() ->{
            //Thread类内部,有一个现成的标志位,可以判定当前的循环是否结束
            while(!Thread.currentThread().isInterrupted()){
                System.out.println("线程工作中");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    //throw new RuntimeException(e);
                    //1.假装没听见,循环继续正常执行
                    e.printStackTrace();
                    // 2.加上一个break,表示线程立即结束
                    //break;
                    //3.先做一些其他工作,完成之后再结束
                    //其他工作的代码
                    //break;
                }
            }
        });
        t.start();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("线程终止");
        t.interrupt();
    }
}

三、 等待一个线程join( )

 有时,我们需要等待一个线程完成它的工作后,才能进行自己的下一步工作

参考实例代码:

/**
 * @author Zhang
 * @date 2024/5/416:54
 * @Description:
 */
public class Demo10 {
    public static void main(String[] args) throws InterruptedException {
        Thread t =  new Thread(()->{
           for (int i = 0; i<5;i++ ){
               System.out.println("t 线程工作中");
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   throw new RuntimeException(e);
               }
           }
        });
        t.start();

        //让主线程等待t线程执行结束
        //一旦调用join,主线程就会出发阻塞。此时t线程就可以趁机完成后续的工作
        //一直阻塞到 t 执行完毕了, join才会解除阻塞,才能继续执行
        System.out.println("join 等待开始");
        t.join();
        //t.join 工作过程:
        //   1)如果t线程正在运行中,此时调用 join 的线程就会阻塞, 一直阻塞到t线程执行结束为止
        //   2)如果t线程已经执行结束了,此时调用 join 线程,就直接返回了,不会涉及到阻塞~~
        System.out.println("join 等待结束");
    }
}

其他一些 join( )方法

四、获取当前线程引用 和 休眠当前线程

4.1 获取当前线程引用

常见方法:public static Thread currentThread(); ——返回当前线程对象的引用
参考代码实例

public class ThreadDemo {
	public static void main(String[] args) {
		Thread thread = Thread.currentThread();
		System.out.println(thread.getName());
	}
}

4.2 休眠当前线程

public class ThreadDemo {
	public static void main(String[] args) throws InterruptedException {
		System.out.println(System.currentTimeMillis());
		Thread.sleep(3 * 1000);
		System.out.println(System.currentTimeMillis());
	}
}

五、 线程的状态

在这里插入图片描述
在这里插入图片描述

总结

 好啦!以上就是今天要讲的内容,本文介绍了Thread类的start( )方法、线程的的中断、等待一个线程join( )、获取当前线程的引用,休眠当前线程,以及线程的引用。在本栏的下一节我们将会继续介绍Thread中重点内容——线程安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1663140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5/11后面部分:+顺序排序+元素交换+计算每门课程的各种成绩+存放规律的数据 注意:一味的复制肯定要出问题,第2个的最后一部分有修改,注意观察

目录 第一个已经输出过一次&#xff1a; 第二个: 编程实现&#xff1a;程序功能是用起泡法对数组中n个元素按从大到小的顺序进行排序。 ​编辑的确出现了一些问题哦&#xff1a; ​编辑目前是可以运行&#xff0c;但AI不给我们通过&#xff1a; 最后还是我的代码获胜&#x…

苹果电脑怎么安装crossover 如何在Mac系统中安装CrossOver CrossOver Mac软件安装说明

很多Mac的新用户在使用电脑的过程中&#xff0c;常常会遇到很多应用软件不兼容的情况。加上自己以前一直都是用Windows系统&#xff0c;总觉得Mac系统用得很难上手。 其实&#xff0c;用户可以在Mac上安装CrossOver&#xff0c;它支持用户在Mac上运行Windows软件&#xff0c;例…

C++牛客小白月赛题目分享(1)生不逢七,交换数字,幻兽帕鲁

目录 1.前言 2.三道题目 1.生不逢七 1.题目描述 2.输入描述: 3.输出描述: 4.示例&#xff1a; 5.题解&#xff1a; 2.交换数字 1.题目描述&#xff1a; 2.输入描述&#xff1a; ​编辑 3.输出描述&#xff1a; 4.示例&#xff1a; 5.题解&#xff1a; 3.幻兽帕…

开源基金会AtomGit教程

大家伙&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 注册 点击链接进入官网&#xff0c;先注册&#xff0c;然后登录&#xff1a;https://atomgit.com/ 编辑个人资料&#xff0c;修改一下自己的信息&#xff0c;用户名后面提交代码的时候要…

frida反检测

一、frida介绍 简单来说&#xff0c;Frida是一个动态代码插桩框架。这意味着它能够在程序运行的时候&#xff0c;不改变原有程序代码的情况下&#xff0c;让你往里面添加自己的代码片段。这听起来可能有点像魔法&#xff0c;但实际上&#xff0c;它是通过一种叫做“HOOK”的技术…

解构复合人工智能系统(Compound AI Systems):关键术语、理论、思路、实践经验

编者按&#xff1a; 大模型的出现为构建更智能、更复杂的人工智能系统带来了新的契机。然而&#xff0c;单一的大模型难以应对现实世界中错综复杂的问题&#xff0c;需要与其他模块相结合&#xff0c;构建出复合人工智能系统&#xff08;Compound AI Systems&#xff09;。 本文…

wordpress 访问文章内容页 notfound

解决&#xff1a; 程序对应的伪静态规则文件.htaccess是空的 网站根目录下要有 .htaccess 文件&#xff0c;然后将下面的代码复制进去。 <ifmodule mod_rewrite.c>RewriteEngine OnRewriteBase /RewriteRule ^index\.php$ - [L]RewriteCond %{REQUEST_FILENAME} !-fRew…

AI领域最伟大的论文检索网站

&#x1f4d1; 苏剑林&#xff08;Jianlin Su&#xff09;开发的“Cool Papers”网站旨在通过沉浸式体验提升科研工作者浏览论文的效率和乐趣。这个平台的核心优势在于利用Kimi的智能回答功能&#xff0c;帮助用户快速了解论文的常见问题&#xff08;FAQ&#xff09;&#xff0…

STL-Setmap

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;我们将进入到CSTL 的学习。STL在各各C的头文件中&#xff0c;以源代码的形式出现&#xff0c;不仅要会用&#xff0c;还要了解底层的实现。源码之前&#xff0c;了无秘密。 STL六大组件 Container通过Allocator取得数据储存…

多标签分割

https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.9/configs/multilabelseg/README_cn.md

el-select选项框内容过长

利用popper-class实现选项框内容过长&#xff0c;截取显示功能&#xff1a; <el-select popper-class"popper-class" :popper-append-to-body"false" v-model"value" placeholder"请选择"><el-optionv-for"item in opt…

大模型prompt实例:知识库信息质量校验模块

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径&#xff1a;AI代理工作流大模型应用开发实用开源项目汇总大模…

war包放在tomcat服务器中,服务启动之后war包并没有正常展开如何解决?

这里我问题出现的是 XWiki 的 WAR 包未能自动展开&#xff0c;于是尝试手动解压并部署。下面是手动解压 WAR 包的步骤思路展示&#xff1a; 1. 准备目录 首先&#xff0c;创建一个新的目录用于存放解压后的文件。在 webapps 目录中创建一个名为 xwiki 的目录&#xff1a; mkd…

webjars学习

webjars介绍 官网&#xff1a;WebJars - Web Libraries in Jars github: WebJars GitHub 文档&#xff1a;WebJars - Documentation WebJAR 是一个用于管理Web前端依赖的工具。它允许开发者将特定的客户端库&#xff08;如JavaScript、CSS等&#xff09;打包成JAR&#xf…

【打工日常】云原生之搭建一款轻量级的开源Markdown笔记工具

一、flatnotes介绍 1.flatnotes简介 一个自托管的&#xff0c;无数据库的笔记网络应用程序&#xff0c;利用平面文件夹的markdown文件进行存储。 2.项目特点 A.干净简单的用户界面B.响应式移动端界面C.原生/所见即所得Markdown编辑模式D.高级搜索功能E.笔记“标签”功能F.…

安服仔番外——IaaS、PaaS、SaaS

云安全也是很重要的一个方向&#xff0c;当然了&#xff0c;今天开启这一篇的目的是up发现安服仔们需要懂的东西很多&#xff0c;确实不只局限于所谓的设备、漏扫、渗透之类的大家明面上都懂的&#xff0c;持续学习&#xff01;恰好up所在的项目对云接触很多&#xff0c;那就刚…

Rank Math Pro插件下载 - 您的SEO优化新引擎

在当今数字时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;对于任何希望提升在线可见性和吸引更多访客的网站来说都是至关重要的。Rank Math Pro是一款先进的SEO插件&#xff0c;专为WordPress网站设计&#xff0c;它能够帮助网站管理员和内容创作者轻松实现SEO最佳实…

撤销及变更:31个自然基金项目!

本周投稿推荐 SSCI • 2区社科类&#xff0c;3.0-4.0&#xff08;社科均可&#xff09; EI • 计算机工程类&#xff08;接收广&#xff0c;录用极快&#xff09; SCI&EI • 4区生物医学类&#xff0c;1.5-2.0&#xff08;录用率99%&#xff09; • 1区工程类&#…

Oracle到PostgreSQL的不停机数据库迁移

1970 年&#xff0c;数据库之父 Edgar Frank Codd 发表了“数据的关系模型”论文&#xff0c;该论文为往后的关系型数据库的发展奠定了基础。1979 年&#xff0c;基于关系模型理论的数据库产品 Oracle 2 首次亮相&#xff0c;并在过去的三四十年时间里&#xff0c;横扫全球数据…

开放式耳机哪个品牌好?性能超强的五款耳机推荐!速来码住!

运动已经融入了我们的日常生活&#xff0c;组团徒步、爬山、跑步、骑行等项目都收到了很人的喜爱。运动加耳机的组合也成了年轻人热爱的方式&#xff0c;在激烈运动的过程中往往会照成颠簸&#xff0c;在佩戴耳机上稳固性和舒适性就变得很重要了&#xff0c;因此开放式蓝牙耳机…