Java---线程讲解(一)

文章目录

    • 1. 进程和线程
    • 2. 多线程实现方式
    • 3. 设置和获取线程名称
    • 4. 线程优先级
    • 5. 线程控制
    • 6. 线程的生命周期


1. 进程和线程

 1. 进程:是正在运行的程序,是系统进行资源分配和调用的基本单位。每一个进程都有它自己的内存空间和系统资源。

 2. 线程:是进程中的单个顺序控制流,是一条执行路径。

  • 单线程:一个进程如果只有一条执行路径,则称为单线程程序。
  • 多线程:一个进程如果有多条执行路径,则称为多线程程序。

2. 多线程实现方式

 1. 创建一个新的执行线程有两种方法,一个是将一个类声明为一个Thread的子类。这个子类应该重写Thread类的run()方法,然后可以分配并启动子类的实例。

 2. 具体继承Thread类:(1) 定义一个MyThread类继承Thread类。 (2) 在MyThread类中重写run()方法。 (3) 创建MyThread类的对象。 (4) 启动线程。

public class MyThread extends Thread{
    @Override
    public void run() {
        for(int i=0;i<200;i++)
        {
            System.out.println(i);
        }
    }
}

public class MyThreadDemo {
    public static void main(String[] args) {
        MyThread my1=new MyThread();
        MyThread my2=new MyThread();

        my1.start();
        my2.start();
    }

}

在这里插入图片描述
 3. 为什么要重写run()方法?因为run()方法是用来封装被线程执行的代码。

 4. run()方法和start()方法的区别?run():封装线程执行的代码,直接调用,相当于普通方法的调用。start():启动线程,然后由JVM调用此线程的run()方法。

3. 设置和获取线程名称

 1. 在上面的例子中用getName()来获取线程名字。这里无参构造方法给出了默认名称。也可以通过setName()方法重新命名线程名称。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

public class MyThread extends Thread{
    @Override
    public void run() {
        for(int i=0;i<200;i++)
        {
            System.out.println(getName()+" "+i);
        }
    }
}

public class MyThreadDemo {
    public static void main(String[] args) {
        MyThread my1=new MyThread();
        MyThread my2=new MyThread();

        my1.setName("线程1");
        my2.setName("线程2");

        my1.start();
        my2.start();
    }

}

在这里插入图片描述

 2. 用带参构造方法设置线程名称。这个时候子类应该继承父类的构造方法。

public class MyThread extends Thread{
    public MyThread(){}
    
    public MyThread(String name){
        super(name);
    }
    @Override
    public void run() {
        for(int i=0;i<200;i++)
        {
            System.out.println(getName()+" "+i);
        }
    }
}

public class MyThreadDemo {
    public static void main(String[] args) {
        MyThread my1=new MyThread("线程1");
        MyThread my2=new MyThread("线程2");

        my1.start();
        my2.start();
    }
}

 3. currentThread():返回对当前正在执行的线程对象的引用。

public class MyThreadDemo {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName()); 
        //输出:main
    }
}

4. 线程优先级

 1. 线程调度有两种模型:(1) 分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片。 (2) 抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一些。

 2. Java使用的是抢占式调度模型。

 3. 假设计算机只有一个CPU,那么计算机在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。所以说多线程程序的执行是有随机性的,因为谁抢到CPU的使用权是不一定的。

 4. Thread类中设置和获取线程优先级的方法:(1) public final int getPriority():返回此线程的优先级。 (2) public final void setPriority(int newPriority):更改此线程的优先级。

 5. 线程默认优先级是5,线程优先级范围是1-10。注意:线程优先级高仅仅表示线程获取的CPU时间片的几率高,并不代表一定先执行完它。(要实现先执行完,得用join())

public class MyThread extends Thread{
    public MyThread(){}

    public MyThread(String name){
        super(name);
    }

    @Override
    public void run() {
        for(int i=0;i<200;i++)
        {
            System.out.println(getName()+" "+i);
        }
    }
}

public class MyThreadDemo {
    public static void main(String[] args) {
        //输出结果都是5,所以线程优先级默认是5
        MyThread my1=new MyThread("线程1");
        MyThread my2=new MyThread("线程2");
        System.out.println(my1.getPriority());
        System.out.println(my2.getPriority());
//       my1.start();
//       my2.start();
    }
}
public class MyThread extends Thread{
    public MyThread(){}

    public MyThread(String name){
        super(name);
    }

    @Override
    public void run() {
        for(int i=0;i<200;i++)
        {
            System.out.println(getName()+" "+i);
        }
    }
}

public class MyThreadDemo {
    public static void main(String[] args) {

        //输出结果都是5,所以线程优先级默认是5
        MyThread my1=new MyThread("线程1");
        MyThread my2=new MyThread("线程2");
        my1.setPriority(10);
        System.out.println(my1.getPriority());
        System.out.println(my2.getPriority());
        my1.start();
        my2.start();
    }
}

在这里插入图片描述

5. 线程控制

方法名说明
static void sleep(long millis)使当前正在执行的线程停留(暂停执行)指定的毫秒数
void join()等待这个线程死亡,让调用它的线程先执行完毕
void setDaemon(boolean on)将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出
public class MyThread extends Thread{
    public MyThread(){}

    public MyThread(String name){
        super(name);
    }

    @Override
    public void run() {
        for(int i=0;i<200;i++)
        {
            System.out.println(getName()+" "+i);
            try {
                //sleep方法必须放到try...catch里
                Thread.sleep(1000); 
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

public class MyThreadDemo {
    public static void main(String[] args) {

        MyThread my1=new MyThread("线程1");
        MyThread my2=new MyThread("线程2");

        my1.start();
        my2.start();
    }
}

在这里插入图片描述

6. 线程的生命周期

在这里插入图片描述

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

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

相关文章

7.上传project到服务器及拉取服务器project到本地、更新代码冲突解决

1.上传project到SVN服务器 1.在eclipse中&#xff0c;从show view里调出SVN资源库视图 2.在SVN资源库窗口的空白位置右键选择新建资源库位置 3.填好服务器的地址 4.资源库导入成功,SVN资源库视图下出现导入的资源库 5.新建project 6.写好project的初始版本 7.右键project --&…

如何摆脱你是一个葡萄酒新手的身份?

刚接触葡萄酒的人可能会有一种模糊的感觉&#xff0c;即他们喜欢白葡萄酒、红葡萄酒或玫瑰红葡萄酒&#xff0c;但他们可能不知道如何描述为什么&#xff0c;也不理解必要的术语。 把葡萄酒词汇想象成类似于讨论食物是很有用的&#xff0c;它是甜的、酸的还是辣的&#xff1f;对…

Jmeter接口测试:jmeter导入和导出接口的处理

JMeter测试导入接口 利用Jmeter测试上传文件&#xff0c;首先可根据接口文档或者fiddler抓包分析文件上传的接口&#xff1b;如下图&#xff1a; 以下是我通过fiddler所截取的文件上传的接口 1、填写导入接口的信息 查看文件上传栏下的填写信息&#xff1a; 文件名称&#x…

Elasticsearch,Kibana集成,x-pack鉴权配置

Elasticsearch,Kibana集成 Java8环境部署[CentOS7] cd /usr/local/src wget https://repo.huaweicloud.com/java/jdk/8u201-b09/jdk-8u201-linux-x64.tar.gztar -xzvf jdk-8u201-linux-x64.tar.gz -C /usr/local#配置环境变量 vim /etc/profile #文末添加 export JAVA_HOME/us…

docker安装及简单使用(Linux版本)

文章目录 前言一、docker安装二、docker命令pull&#xff08;安装镜像&#xff09;images&#xff08;查看镜像&#xff09;run&#xff08;创建容器&#xff09;删除容器exec&#xff08;进入运行中的容器&#xff09;常用命令 总结如有启发&#xff0c;可点赞收藏哟~ 前言 ht…

路由跳转添加进度条

根据npm官网的步骤&#xff1a; 1.先安装nprogress npm install nprogress 2.引入nprogress和样式文件 import nprogress from nprogress import nprogress/nprogress.css 3.在前置守卫添加进度条的展示 //全局前置守卫 router.beforeEach((to: any, from: any, next: an…

算法训练 第十周

二、 删除有序数组中的重复项 II 1.双指针 我们在遍历整个数组的时候如果发现某个元素出现的次数超过了两次&#xff0c;就先记录下它出现的第三个位置&#xff0c;然后找到下一个与它不同的元素&#xff0c;从这个元素开始将其和其后面的所有元素都复制到之前记录的位置之后&…

C++ IO库

IO类 IO对象不能拷贝和赋值 iostream 表示形式的变化&#xff1a; 将100转换成二进制序列 然后格式化输出 x,y共用一块内存 输出的时候用不同的方式解析同一块内存 操作 格式化&#xff1a;内部表示转换为相应字节序列 缓存&#xff1a;要输出的内容放到缓存 编码转换&…

python爬虫-某公开数据网站实例小记

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; 第一步&#xff1a;分析页面和请求方式 此网站没有技巧的加密&#xff0c;仅是需要携带cookie和请求…

IntelliJ IDE 插件开发 | (二)UI 界面与数据持久化

系列文章 IntelliJ IDE 插件开发 |&#xff08;一&#xff09;快速入门 前言 在上一篇文章中介绍了在IDEA下开发、运行和安装插件的基本步骤&#xff0c;因此创建项目等基础步骤不再赘述&#xff0c;本文则开始介绍如何进行 UI 界面的开发以及相关数据的持久化存储&#xff…

安全测试工具,自动发现网站所有URL!

作为一个安全测试人员来说&#xff0c;首先要拿到网站所有url&#xff0c;然后根据拿到的url进行渗透测试进行漏洞挖掘。本文给大家介绍的是如何拿到一个网站所有的url。 深度爬取层级控制 现在我也找了很多测试的朋友&#xff0c;做了一个分享技术的交流群&#xff0c;共享了很…

集成开发环境 PyCharm 的安装【侯小啾python基础领航计划 系列(二)】

集成开发环境PyCharm的安装【侯小啾python基础领航计划 系列(二)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

图灵测试:人工智能的终极挑战

图灵测试&#xff1a;人工智能的终极挑战 一、引言 在人工智能的发展历程中&#xff0c;图灵测试一直被视为一个重要的里程碑。这个由英国计算机科学家艾伦图灵提出的实验&#xff0c;旨在评估人工智能是否能够像人一样思考和表达&#xff0c;为人类与机器智能之间的界限设立了…

Python实现FA萤火虫优化算法优化随机森林分类模型(RandomForestClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

【征稿倒计时十天,ACM独立出版,有确定的ISBN号,ei检索稳且快】

2023 人工智能、系统与网络安全国际学术会议 (AISNS 2023&#xff09; 2023 International Conference on Artificial Intelligence, Systems and Network Security 由西南科技大学计算机科学与技术学院主办的2023人工智能、系统与网络安全国际学术会议 (AISNS 2023&#xff0…

C语言给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)

这个题目要求的输出是一串数字&#xff01;&#xff01;&#xff01; 不是下面&#xff1a;输入在一行中给出 10 个非负整数&#xff0c;顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50&#xff0c;且至少拥有 1 个非…

使用Jmeter进行http接口测试怎么做?

前言&#xff1a; 本文主要针对http接口进行测试&#xff0c;使用Jmeter工具实现。 Jmter工具设计之初是用于做性能测试的&#xff0c;它在实现对各种接口的调用方面已经做的比较成熟&#xff0c;因此&#xff0c;本次直接使用Jmeter工具来完成对Http接口的测试。 一、开发接…

Lidar-SLAM的历史与现状

文章&#xff1a;LiDAR-based SLAM for robotic mapping: state of the art and new frontiers 作者&#xff1a;Xiangdi Yue and Miaolei He 编辑&#xff1a;点云PCL 欢迎各位加入知识星球&#xff0c;获取PDF论文&#xff0c;欢迎转发朋友圈。文章仅做学术分享&#xff0c…

岚图追光PHEV 25.28万元起售,开卷混动豪华轿车

作者&#xff5c;Amy 编辑&#xff5c;德新 12月5日晚&#xff0c;2023岚图科技日上&#xff0c;岚图汽车正式发布了其新一代SOA电子电气架构天元架构&#xff0c;并宣布了以“新行政电动旗舰”为定位的岚图追光PHEV正式上市。 岚图追光PHEV是岚图汽车旗下首款电混轿车&#x…

Selenium 中并行测试的重要性!

随着技术的进步&#xff0c;测试解决方案变得更具可扩展性&#xff0c;加速了团队从手动测试到Selenium测试自动化的转型。但是成年人的世界&#xff0c;没有什么是容易的。对于许多团队来说&#xff0c;并行运行多个测试仍然是不可扩展的。他们倾向于遵循传统的顺序执行测试方…