java —— 线程(一)

一、进程与线程

一个进程可以包含一个以上的线程,CPU 时间片切换的基本单位是线程。

二、创建线程

(一)继承 Thread 类

public class Task extends Thread{
    @Override                       //重写run方法
    public void run()
    {
        System.out.println("this is a thread");
    }

    public static void main(String[] args)
    {
        Task task=new Task();
        task.start();
    }
}

(二)实现 Runnable 接口

public class Task implements Runnable{
    @Override                       //重写run方法
    public void run()
    {
        System.out.println("this is a thread");
    }

    public static void main(String[] args)
    {
        Task task=new Task();
        Thread thread=new Thread(task);    //利用Thread的构造方法创建一个线程
        thread.start();
    }
}

(三)实现 Callable 接口 

public class Task implements Callable<String>{
    @Override                       //重写run方法
    public String call()
    {
       return "this is a thread";
    }

    public static void main(String[] args)
    {
        Task task=new Task();
        FutureTask<String> ft=new FutureTask(task);
        Thread thread=new Thread(ft);    //利用Thread的构造方法创建一个线程
        thread.start();
        String x=ft.get();
        System.out.println(x);
    }
}

 除 Thread 之外,无论 Runnable 还是 Callable 都无法独立启动线程,都需要借助 Thread 才能实现线程启动。

三、获取当前线程

① 获取当前进程:Thread.currentThread()                                                       

② 获取当前进程的名称:Thread.currentThread().getName()                          

③ 设置当前进程的名称:Thread.currentThread().setName(String name)       

④ 获取当前线程的级别:Thread.currentThread().getPriority()                       

⑤ 设置当前线程的级别:Thread.currentThread().setPriority()                        

 四、run() 方法与 start() 方法的区别

run() 方法用于存放任务代码,但直接调用 run() 方法无法启动线程,只是调用了一个普通的 run 方法,因此可以调用无限次。start() 方法用于启动线程,只能启动一次,连续启动会报错,线程启动之后会自动调用 run 方法里面的任务代码。

五、线程休眠

Thread.sleep(int x)    x 表示毫秒数

六、线程让渡执行权

Thread.yield()     表示暂停当前线程,将 CPU 资源让给其他线程。这里让渡的只是一个机会,不代表当前线程一定会停止,也不代表别的线程一定会执行。

七、线程中断

① 标记线程中断的位置:.interrupt()

② 判断线程是否中断:.isInterrupted()

③ 判断线程是否中断并清除中断标志:.interrupted()   

八、将一个线程加入另一个线程

.join()

public class Task extends Thread{
    public static void main(String[] args)
    {
        Thread th1=new Thread(){
            public void run(){
            System.out.println("1");
            }
        };

        Thread th2=new Thread(){
            public void run(){
            th1.join();
            System.out.println("2");
            }
        };

        th1.start();
        th2.start();
    }
}

本案例中,将线程 th1 加入到 th2 中,th2 会等待 th1 执行完毕之后再执行本任务中的代码。

九、守护线程

(一)设置守护线程

.setDaemon(true),将一个线程设置为主线程的守护线程,当主线程结束时,守护线程也会随之结束。

public class Task{
    public static void main(String[] args)
    {
        Thread th=new Thread()
        {
            public void run()
            {
                while(true){System.out.println("123");}     //死循环输出123
            }
        };
        th.setDaemon(true);                     //将th设置为守护线程
        th.start();
        try {
			Thread.sleep(500);                 //主线程休眠500毫秒
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
    }
}

本案例中,当主线程休眠500毫秒时,子线程不断输出123;主线程500毫秒结束时,主线程执行完毕,子线程随之结束。

(二)判断守护线程

.isDaemon(),如果一个线程是守护线程,返回 true;否则返回 false。

十、判断线程是否存活

.isAlive(),线程存活的时间介于启动之后,执行完毕之前,只有在这段时间内返回 true。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

eNSP学习——RIP路由协议的汇总

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、配置RIPv1协议 3、配置RIPv2自动汇总 4、配置RIPv2手动汇总 需要eNSP各种配置命令的点击链接自取&#xff1a;华为&#xff45;NSP各种设备配置命令大全PDF版_ensp配置命令大全…

Redis系列-5 Redis分布式锁

背景&#xff1a; 本文介绍Redis分布式锁的内容&#xff0c;包括Redis相关命令和Lua脚本的介绍&#xff0c;以及操作分布式锁的流程与消息&#xff0c;最后结合Redission源码介绍分布式锁的实现原理。 1.基本命令 1.1 基本键值对的设置 设值: set key value 取值: get key …

数据分析必备:一步步教你如何用Pandas做数据分析(21)

1、Pandas 可视化 Pandas 可视化是指使用 Pandas 库中的函数和方法来创建数据可视化图表。Pandas 提供了一些基本的绘图功能&#xff0c;例如折线图、柱状图、饼图等&#xff0c;可以通过调用相应的函数来创建这些图表。 2、基本绘图&#xff1a;绘图 Series和DataFrame上的…

【启明智显分享】基于工业级芯片Model3A的7寸彩色触摸屏应用于智慧电子桌牌方案

一场大型会议的布置&#xff0c;往往少不了制作安放参会人物的桌牌。制作、打印、裁剪&#xff0c;若有临时参与人员变更&#xff0c;会务方免不了手忙脚乱更新桌牌。由此&#xff0c;智能电子桌牌应运而生&#xff0c;工作人员通过系统操作更新桌牌信息&#xff0c;解决了传统…

2024.6.9 四

Python的异常处理 在python里,错误和异常是不同的概念 错误: Python 的语法错误或者称之为解析错,大多是因为写代码写错了出现的 异常: 即便 Python 程序的语法是正确的&#xff0c;在运行它的时候&#xff0c;也有可能发生错误。运行期检测到的错误被称为异常。 大多数的异常…

QT串口调试助手V2.0(源码全开源)--上位机+多通道波形显示+数据保存(优化波形显示控件)

首先关于Qt的安装和基本配置这里就不做重复说明了&#xff0c;注&#xff1a;本文在Qt5.14基础上完成 完整的项目开源仓库链接在文章末尾 图形控件——qcustomplot QCustomPlot是一个基于Qt框架的开源绘图库&#xff0c;用于创建高质量的二维图表和数据可视化。 QCustomPlot…

【PL理论】(12) F#:模块 | 命名空间 | 异常处理 | 内置异常 |:? | 相互递归函数

&#x1f4ad; 写在前面&#xff1a;本章我们将介绍 F# 的模块&#xff0c;我们前几章讲的列表、集合和映射都是模块。然后我们将介绍 F# 中的异常&#xff0c;以及内置异常&#xff0c;最后再讲解一下相互递归函数。 目录 0x00 F# 模块&#xff08;Module&#xff09; 0x01…

堡垒机的自动化运维,快速安全提升运维效率

随着信息技术的突飞猛进&#xff0c;企业对于IT系统的依赖程度日益加深&#xff0c;不仅希望可以提高运维效率&#xff0c;也希望能保障IT系统的安全。因此堡垒机与自动化运维技术的结合应运而生&#xff0c;堡垒机的自动化运维&#xff0c;快速安全提升运维效率。今天我们就来…

人工智能和物联网如何结合

欢迎来到 Papicatch的博客 文章目录 &#x1f349;引言 &#x1f349;AI与IoT的结合方式 &#x1f348;数据处理和分析 &#x1f34d;实例 &#x1f348;边缘计算 &#x1f34d;实例 &#x1f348;自动化和自主操作 &#x1f34d;实例 &#x1f348;安全和隐私保护 &…

YOLOv10 超详细解析 | 网络结构、训练策略、论文解读

网络结构 1. Backbone 2. Head 3. 说明 网络结构按 YOLOv10m 绘制&#xff0c;不同 scale 的模型在结构上略有不同&#xff0c;而不是像 YOLOv8 一样仅调整 depth 和 width。Head 有部分后续计算与 YOLOv8 完全相同&#xff0c;上图省略&#xff0c;具体请看此文。YOLOv10 整…

以sqlilabs靶场为例,讲解SQL注入攻击原理【42-53关】

【Less-42】 使用 or 11 -- aaa 密码&#xff0c;登陆成功。 找到注入点&#xff1a;密码输入框。 解题步骤&#xff1a; # 获取数据库名 and updatexml(1,concat(0x7e,(select database()),0x7e),1) -- aaa# 获取数据表名 and updatexml(1,concat(0x7e,(select group_conca…

QT案例 记录解决在管理员权限下QFrame控件获取拖拽到控件上的文件路径

参考知乎问答 Qt管理员权限如何支持拖放操作&#xff1f; 的回答和代码示例。 解决在管理员权限运行下&#xff0c;通过窗体的QFrame子控件获取到拖拽的内容。 目录标题 导读解决方案详解示例详细 【管理员权限】在QFrame控件中获取拖拽内容 【管理员权限】继承 IDropTarget 类…

Invalid JSON text:“Invalid value.“ at position 0 in value for column ‘user.info

你们好&#xff0c;我是金金金。 场景 我正在练习mybatis-plus&#xff0c;在插入一条数据的时候报错了&#xff0c;错误信息如上图 排查 排查之前我先贴一下代码 以下为数据库字段类型 在插入的过程中报错&#xff1a;Data truncation: Invalid JSON text: "Invalid val…

百度高级项目经理洪刘生受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 百度在线网络技术&#xff08;北京&#xff09;有限公司IDG智能驾驶业务部高级项目经理洪刘生先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“互联网PMO赋能战略项目集管理实战分享”。大会将于6月29-30日在北京举办…

FCN-语义分割中的全卷积网络

FCN-语义分割中的全卷积网络 语义分割 语义分割是计算机视觉中的关键任务之一&#xff0c;现实中&#xff0c;越来越多的应用场景需要从影像中推理出相关的知识或语义&#xff08;即由具体到抽象的过程&#xff09;。作为计算机视觉的核心问题&#xff0c;语义分割对于场景理…

【西瓜书】9.聚类

聚类任务是无监督学习的一种用于分类等其他任务的前驱过程&#xff0c;作为数据清洗&#xff0c;基于聚类结果训练分类模型 1.聚类性能度量&#xff08;有效性指标&#xff09; 分类任务的性能度量有错误率、精度、准确率P、召回率R、F1度量(P-R的调和平均)、TPR、FPR、AUC回归…

流程的控制

条件选择语句 我们一般将条件选择语句分为三类&#xff1a; 单条件双条件多条件 本篇文章将分开诉说着三类。 单条件 单条件的语法很简单&#xff1a; if (条件) {// 代码}条件这里我们需要注意下&#xff0c;可以向里写入两种&#xff1a; 布尔值布尔表达式 当然&…

【算法刷题 | 动态规划08】6.9(单词拆分、打家劫舍、打家劫舍||)

文章目录 21.单词拆分21.1题目21.2解法&#xff1a;动规21.2.1动规思路21.2.2代码实现 22.打家劫舍22.1题目22.2解法&#xff1a;动规22.2.1动规思路22.2.2代码实现 23.打家劫舍||23.1题目23.2解法&#xff1a;动规23.2.1动规思路23.2.2代码实现 21.单词拆分 21.1题目 给你一…

Unity动画录制工具在运行时录制和保存模型骨骼运动的方法录制动画给其他角色模型使用支持JSON、FBX等格式

如果您正在寻找一种在运行时录制和保存模型骨骼运动的方法&#xff0c;那么此插件是满足您需求的完美解决方案。 实时录制角色运动 将录制到的角色动作转为动画文件 将录制好的动作给新的角色模型使用&#xff0c;完美复制 支持导出FBX格式 操作简单&#xff0c;有按钮界面…

Nacos的配置中心

1.前言 除了注册中心和负载均衡之外, Nacos还是⼀个配置中心, 具备配置管理的功能. Namespace 的常用场景之一是不同环境的配置区分隔离&#xff0c; 例如开发测试环境和⽣产环境的配置隔离。 1.1 为什么需要配置中心&#xff1f; 当前项目的配置都在代码中&#xff0c;会存…