多线程~实现多线程

news2024/12/23 13:46:03

实现多线程

进程:是正在运行的程序

  • 是系统进行资源分配和调用的独立单位
  • 每一个进程都有它自己的内存空间和系统资源

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

  • 单线程:一个进程如果只有一条执行路径,则称为单线程程序,如:记事本程序
  • 多线程:一个进程如果有多条执行路径,则称为多线程程序,如:扫雷程序

多线程的实现方式(一)

方式1:继承Thread类

  • 定义一个类Mythread继承Thread类
  • 在Mythread类中重写run()方法
  • 创建Mythread类的对象
  • 启动线程

两个小问题:

  • 为什么要重写run()方法?
    • 因为run()是用来封装被线程执行的代码
  • run()方法和start()方法的区别?
    • run():封装线程执行的代码,直接调用,相当于普通方法的调用
    • start():启动线程;然后由JVM调用此线程的run()方法

设置和获取线程名称

Thread类中设置和获取线程名称的方法

  • void setName(String name):将此线程的名称更改为等于参数name
  • String getName():返回此线程的名称
  • 通过构造方法也可以设置线程名称

如何获取main()方所在的线程名称?

  • public static Thread currentThread():返回对当前正在执行的线程对象的引用
//MyThreadDemo
public class MyThreadDemo {
    public static void main(String[] args) {
        MyThread mt1 = new MyThread();
        MyThread mt2 = new MyThread();
        mt1.setName("飞机");
        mt2.setName("火车");
        MyThread mt3 = new MyThread("跑车");
        mt1.run();
        mt2.run();
        mt3.run();
        System.out.println("-------");
        mt1.start();
        mt2.start();
        mt3.start();
        System.out.println("-------");
        /*System.out.println(Thread.currentThread().getName()); //main*/
        //run是按顺序执行,start是线程随机的
    }
}
//MyThread
public class MyThread extends Thread {
    public MyThread() {
    }

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

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

线程调度

线程有两种调度模式

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

Java使用的是抢占式调度模式

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

Thread类中设置和获取线程优先级的方法

  • public final int getPriority():返回此线程的优先级

  • public final void setPriority(int newPriority):更改此线程的优先级

    线程默认优先级是5;线程优先级的范围是:1-10

    线程优先级高仅仅表示线程获取的CPU时间片的几率高,但是要在次数比较多,或者多次运行的时候才能看到你想要的效果

线程控制

在这里插入图片描述

//sleep测试
//MyThreadDemo类
public class MyThreadDemo {
    public static void main(String[] args) {
        MyThread mt1 = new MyThread();
        MyThread mt2 = new MyThread();
        MyThread mt3 = new MyThread();
        mt1.setName("曹操");
        mt2.setName("刘备");
        mt3.setName("孙权");
        mt1.start();
        mt2.start();
        mt3.start();
    }
}
//MyThread类
public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + ":" + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
//join测试
//MyThreadDemo2类
public class MyThreadDemo2 {
    public static void main(String[] args) {
        MyThread2 mt1 = new MyThread2();
        MyThread2 mt2 = new MyThread2();
        MyThread2 mt3 = new MyThread2();
        mt1.setName("康熙");
        mt2.setName("四阿哥");
        mt3.setName("八阿哥");
        mt1.start();
        try {
            mt1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        mt2.start();
        mt3.start();
    }
}
//MyThread2类
public class MyThread2 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + ":" + i);
        }
    }
}
//setDaemon测试
//MyThreadDemo3类
public class MyThreadDemo3 {
    public static void main(String[] args) {
        MyThread3 mt1 = new MyThread3();
        MyThread3 mt2 = new MyThread3();
        mt1.setName("张飞");
        mt2.setName("关羽");
        //设置主线程为刘备
        Thread.currentThread().setName("刘备");
        //设置守护线程
        mt1.setDaemon(true);
        mt2.setDaemon(true);

        mt1.start();
        mt2.start();

        for(int i=0;i<10;i++){
            System.out.println(Thread.currentThread().getName()+":"+i);
        }

    }
}
//MyThread3类
public class MyThread3 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + ":" + i);
        }
    }
}

线程生命周期

在这里插入图片描述

多线程的实现方式(二)

方式2:实现Runnable接口

  • 定义一个类MyRunnable实现Runnable接口
  • 在MyRunnable类中重写run()方法
  • 创建Runnable类的对象
  • 创建Thread类的对象,把Runnable对象作为构造方法的参数
  • 启动线程

多线程的实现方案有两种

  • 继承Thread类
  • 实现Runnable接口

相比继承Thread类,实现Runnable接口的好处

  • 避免了Java单继承的局限性
  • 适合多个相同程序的代码去处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好的体现了面向对象的设计思想
//MyRunnableDemo类
public class MyRunnableDemo {
    public static void main(String[] args) {
        MyRunnable mr = new MyRunnable();
        Thread t1 = new Thread(mr,"火车");
        Thread t2 = new Thread(mr,"飞机");
        t1.start();
        t2.start();
    }
}
//MyRunnable类
public class MyRunnable implements Runnable {

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

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

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

相关文章

小游戏开发指南及过程中的难点问题

如果仅仅针对个人开发者来讲&#xff0c;要独立开发一款大型游戏几乎无可能&#xff0c;更大成功的可能还是开发一款类似《羊了个羊》这样洗脑的小程序游戏。 所以这里主要论述小游戏开发的情况&#xff0c;也就是小程序游戏&#xff0c;首先从小游戏的开发流程来看&#xff1…

chatGPT:12.12 之后更新的 chatGPT 的本地部署和接口调用,解决 response 403 (无法连接openai服务器)问题

文章目录问题源代码改动Session token 的获取cf_clearance 的获取user-agent 的获取将 config.json.sample 内容修改并移动位置附注&#xff1a;环境配置python > 3.7特别提示playwright & cf_clearancerevChatGPT 版本httpxOpenAIAuth删除 import 中的错误后记问题 因…

web网页设计期末课程大作业:基于HTML+CSS+JavaScript个人书画作品展示HTML模板(6页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Matlab论文插图绘制模板第69期—带误差棒的折线图(Errorbar)

在之前的文章中&#xff0c;分享了一系列Matlab折线图的绘制模板&#xff1a; 这一次&#xff0c;再来分享一种特殊的折线图&#xff1a;带误差棒的折线图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系列&#xff0c;旨在降低大家使用Matl…

C语言判断一个整数是不是素数(质数)、求100以内的所有素数、求前50个素数

目录 一.什么是素数&#xff08;质数 Prime&#xff09; 二.判断一个整数是不是素数&#xff08;质数&#xff09;代码 三.求100以内的所有素数&#xff08;质数&#xff09; 四.输出前50个素数&#xff08;质数&#xff09; 一.什么是素数&#xff08;质数 Prime&#xff0…

5、metasploit信息搜集

一、概念 针对目标在开放端口、以及运行的服务进行探测。portscan端口扫描mysql安全测试服务版本确定密码嗅探SNMP探测二、metasploit中信息搜集模块 2.1、use auxiliary/gather/ 与 use auxiliary/scanner/ 2.2、针对SMB版本探测&#xff08;默认445端口&#xff09; 也可以探…

vTESTstudio入门到精通 - CANoe工程导入vTESTstudio_02

前面我们已经讲完了如何配置出来一个vTESTstudio工程,并且编译成一个可执行的文件,接下来我们就是要把这块可执行文件导入到CANoe中,通过CANoe工程来执行我们编译的脚本,实现对应功能的测试,今天就是给大家分享如何导入。 二、CANoe工程导入vTESTstudio执行文件 1、创建一…

猿如意中的【blender】工具详情介绍

文章目录一、工具名称二、下载安装渠道2.1 什么是猿如意&#xff1f;2.2 如何下载猿如意&#xff1f;三、工具介绍四、blender介绍4.1 blender简介4.2 背景4.3 主要功能五、软件安装过程5.1 如何在猿如意中下载开发工具blender&#xff1f;5.2 下载blender软件截图5.3 blender安…

基于51单片机的数字电压表设计

程序运行图&#xff1a; 仿真原理图&#xff1a; 部分程序&#xff1a; #define LED_GLOBAL 1 #include "led.h" void ledDelay(uint ms) { uchar delayi; while(--ms) { for(delayi0;delayi<124;delayi); } } void init_led(void) { LEDsegLedCode[0]; L…

四、JavaScript——基本语法

1.注释 <script>/*1.多行注释*///2. 单行注释</script> 2.大小写 JS严格区分大小写 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"…

Web前端105天-day42-JSCORE

JSCORE02 目录 前言 一、复习 二、函数在对象中触发方式 2.1.call 2.2.apply 2.3.bind 三、引用类型 四、构造函数 五、new 六、原型理念 ​七、原型 八、class 九、严格模式 十、ES6 十一、let与const 总结 前言 JSCORE02学习开始 一、复习 JS引擎具有自动修…

操作系统学习笔记_4 文件;磁盘

文件 有信息的数据集合。 文件包含的信息&#xff1a;文件名、标识符&#xff08;操作系统要看&#xff09;、类型、大小、创建修改时间、所有者、安全信息。 文件管理 文件分为无结构的流式文件和有结构的记录式文件。记录式文件由一条条记录组成。 文件存放在根目录里的…

DFGN-Dynamically Fused Graph Network for Multi-hop Reasoning 论文阅读

文章目录介绍相关工作text-based QA多跳QA推理模型段落选择器构建实体图编码 Query 和 ContextFusion Block 推理Doc2GraphDynamic Graph AttentionUpdate QueryGraph2Doc预测介绍 将 DFGN 模型用于HotpotQA &#xff08;TBQA类型的公开数据集&#xff09; QA任务注重从单一的…

ADI Blackfin DSP处理器-BF533的开发详解46:图像处理专题-Translation (图像平移处理)(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了图像平移处理&#xff0c;代码运行时&#xff0c;会通过文件系统打开工程文件根目下" …/ImageView"路径中的 tes…

【爬虫实战项目】Python爬取Top100电影榜单数据并保存csv文件(附源码)

前言 今天给大家介绍的是Python爬取Top100电影榜单数据保存csv文件&#xff0c;在这里给需要的小伙伴们代码&#xff0c;并且给出一点小心得。 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫&#xff0c;基本的是加请求头&#xff0c;但是这样的纯文本数据爬取的…

(四)springcloud之Nacos注册服务与发现-1

前言&#xff1a;一段时间来忙忙碌碌&#xff0c;回头发现很多技术已经更新了很多&#xff0c;很长一段时间都在忙其他的事情&#xff0c;以至于没有太多关注于微服务更新&#xff0c;今天更新了下版本以便于后期使用&#xff0c;突然发现很多东西已经被删除或直接改变了&#…

TIA博途_序列化指令Serialize的具体使用方法示例

TIA博途_序列化指令Serialize的具体使用方法示例 序列化指令的基本用途: 首先,我们可以查看TIA博途中的帮助文件说明,如下图所示: 简单总结就是: 把复杂的数据或数据类型(例如UDT、STRUCT等)转换成BYTE或CHAR类型的数组,从而方便数据处理,通常在通信数据的处理中可以…

DBCO-PEG-amine,二苯并环辛炔PEG氨基 MV 1K、2K、3.4K、4K、5K、10K

1、试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a; DBCO用于无铜点击化学。在没有铜催化剂的情况下&#xff0c;与叠氮化合物的反应非常迅速。这种反应是非常迅速&#xff0c;温和&#xff0c;和生物相容性&#xff0c;NH2和带N…

数据结构---KMP算法

一、KMP算法简介 KMP算法是一个字符串匹配算法&#xff0c;对暴力算法BF的一种优化&#xff0c;使得时间复杂度大量的降低。 基本概念&#xff1a; s[]是字符串&#xff0c;简单来说&#xff0c;就是比较长的字符串。p[]是模式串&#xff0c;简单来说&#xff0c;就是比较短的…

使用小爱同学语音控制电脑关机 - Winform C#

使用小爱同学语音控制电脑变关机前言实现原理准备注册巴法云账号接入巴法云接入米家编写程序连接TCP接收信息并运行关机指令发送指令订阅主题添加心跳机制后台运行阻止默认关闭窗口事件完整代码前言 小爱同学应该已经是家喻户晓的了&#xff0c;现在一直用来控制家里的家电。于…