Java-基础-5.多线程

news2024/11/22 8:56:16

一:为什么出现多线程?

  1. 线程是指,一段代码的运行(cpu,代码,数据)。但是,生产中,我们真实情况,数据都是并发传送的,所以,我们仅仅使用一条路来处理,就会发生数据堵塞的情况。所以,我们使用多线程,启动多条路来跑代码。

二:什么是多线程?

  1. 线程和进程,代码的区别。
   (1)代码是静态的概念。
   (2)进程是动态的概念。在运行的时候,包括cpu,代码,数据。本质上讲,进程是分配资源的单位。
   (3)线程是指操作系统能够调用的最小的单位。一个进程可以包含多个进程。本质上讲,线程是调度和执行的单位。

三:怎么使用多线程?

  1.继承Thread类实现。
    (1)类继承Thread。
    (2)类中实现run方法。
    (3)在主函数中,创建对象。
    (4)对象调用start方法。

package day04_thread;
//第一种方法,继承Thread类实现
public class Thread_test extends Thread{
    int i;

    public Thread_test(int i) {
        this.i = i;
    }

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
    }

    @Override
    public void run() {
        System.out.println("这次运行是第"+i+"次!");
    }
}

package day04_thread;

public class Thread_main {
    public static void main(String[] args) {
        Thread_test thread_test = new Thread_test(1);
        Thread_test thread_test1 = new Thread_test(2);
        Thread_test thread_test2 = new Thread_test(3);

        thread_test.start();
        thread_test1.start();
        thread_test2.start();
    }
}

  2.实现Runnable接口。
    (1)类实现接口Runnable。
    (2)类中实现run方法。
    (3)在主函数中,创建对象。
    (4)创建Thread对象。
    (5)对象调用start方法。

package day04_thread;

public class Thread_Runnable implements Runnable{
    String name;

    public Thread_Runnable(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println("这个人名字是"+name);
    }
}

package day04_thread;

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

        Thread_Runnable zzy = new Thread_Runnable("zzy");
        Thread thread = new Thread(zzy);
        Thread_Runnable zzx = new Thread_Runnable("zzx");
        Thread thread1 = new Thread(zzx);
        Thread_Runnable iop = new Thread_Runnable("iop");
        Thread thread2 = new Thread(iop);

        thread.start();
        thread1.start();
        thread2.start();
    }
}

  3.实现Callable接口。
    (1)类实现接口Callnable。
    (2)类中实现call方法。
    (3)在主函数中,创建对象。
    (4)创建FutureTask对象。
    (5)创建Thread对象。
    (6)对象调用start方法。

package day04_thread;

import java.util.concurrent.Callable;

public class Thread_Callable implements Callable {
    int i;

    public Thread_Callable(int i) {
        this.i = i;
    }

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
    }

    @Override
    public Object call() throws Exception {
        System.out.println(i);
        return null;
    }
}

package day04_thread;

import com.sun.org.apache.xpath.internal.functions.FuncTrue;

import java.util.concurrent.FutureTask;

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

        Thread_Callable thread_callable = new Thread_Callable(1);
        FutureTask futureTask = new FutureTask<>(thread_callable);
        Thread thread = new Thread(futureTask);
        Thread_Callable thread_callable1 = new Thread_Callable(2);
        FutureTask futureTask1 = new FutureTask<>(thread_callable1);
        Thread thread1 = new Thread(futureTask1);
        Thread_Callable thread_callable2 = new Thread_Callable(3);
        FutureTask futureTask2 = new FutureTask<>(thread_callable2);
        Thread thread2 = new Thread(futureTask2);

        thread.start();
        thread1.start();
        thread2.start();
    }
}

  4.线程池。
  5.对比。
    (1)Thread:继承方式,不建议使用,因为Java是单继承的继承了Thread就没办法继承其它类了,不够灵活。
    (2)Runnable:实现接口,比Thread类更加灵活,没有单继承的限制Callable: Thread和Runnable都是重写的run()方法并目没有返回值。
    (3)callable是重写的call0方法并且有返回值并可以借助FutureTask类来判断线程是否已经执行完毕或者取消线程执行当线程不需要返回值时使用Runnable,需要返回值时就使用Callable。
  6.线程的方法。
在这里插入图片描述    优先级分为1-10,优先级越高,说明先执行的概率越大,但是不是一定执行它。

四:线程多种状态

在这里插入图片描述
  1.新建状态。使用new关键字和其他子类,建立一个线程。
  2.就绪状态。在调用start。
  3.运行状态。在执行run()之后。
  4.阻塞状态。当一个线程执行了sleep(失眠),suspend(挂起)等方法市区资源
    (1)sleep,方法需要指定等待的时间,之后在进行执行。参数是毫秒。

 @Override
    public Object call() throws Exception {
        System.out.println("iopokdo");
        if(i==1) {Thread.sleep(5000);}
        System.out.println("diyi"+i);
              return null;
    }

    (2)yield,让当前线程重新回到就绪状态。
    (3)join,当遇到这个方法,其他线程让出资源,先让这个线程跑完之后,在去跑其他线程。
  5.死亡状态。当程序运行结束之后。另外一种,执行stop。

五:锁

  1. synchronized方法 和 synchronized块。

synchronized方法在这里插入图片描述
synchronized块
在这里插入图片描述
后者对比前者效率更高。

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

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

相关文章

城市交通应急广播系统方案

恒星科通发布于2023-2-2 一、城市交通指挥与疏导广播系统概述 城市交通指挥与疏导广播即“GSM 无线智能广播”&#xff0c;是利用 GSM 无线接入设备与扩音广播系统组合形成的一款 GSM 无线智能广播系统&#xff0c;该系统用在交通指挥与疏导等智能交通项目有不可替代的优势。系…

C语言之深入解析如何理解指针和结构体指针、指针函数、函数指针

一、指针变量 首先要明白指针就是一个变量&#xff0c;可以使用如下代码来验证&#xff1a; #include "stdio.h"int main(int argc, char **argv) {unsigned int a 10;unsigned int *p NULL;p &a;printf("&a %d\n",a);printf("&a …

Docker如何连接至本地私服Harbor中 推送镜像、查看镜像、下载镜像

1.基础环境 win/mac/linux装有Docker私服 Harbor Docker Docker中文站 Docker官方站 下载并安装Docker Harbor Harbor GitHub Harbor 官方地址 下载并安装 Harbor (测试的话 推荐用Docker镜像来启动Harbor 减少环境问题) 2.配置流程 登录Harbor 启动后 访问 Harbor 的…

状态空间模型与卡尔曼滤波

1.状态空间模型 状态空间模型 (State Space Model)&#xff0c;包括两个方程模型&#xff1a; 一是状态方程模型&#xff0c;反映动态系统在输入变量作用下在某时刻所转移到的状态&#xff1b; 二是输出或测量方程模型&#xff0c;它将系统在某时刻的输出和系统的状态及输入变…

1.Echarts的简单使用

目录 1 下载echarts.min.js 2 使用示例 3 其他参数 Echarts是做前端数据可视化的&#xff0c;数据可视化是将数据做成图表&#xff0c;常见的可视化库有D3.js&#xff0c;ECharts.js,Highchart.js,AntV等 ECharts官网地址 Apache ECharts 进入后点击所有示例 示例中有各…

【MySQL】《狂飙》电视剧火了,如果程序一直狂飙,扛不住了,怎么办呢?

程序如果狂飙了怎么办呢&#xff1f;《狂飙》电视剧你看了吗&#xff1f;程序“狂飙”&#xff0c;你担心吗&#xff1f;性能优化步骤适合创建索引的情况不适合创建索引的情况Explain 性能分析id说明select_type 说明type字段说明Extra说明一下《狂飙》电视剧你看了吗&#xff…

PMI开通便捷的人民币付款

人民币付款通道正式开通啦当PMI持证人士通过PMI全球英文网站(www.pmi.org )进行证书更新缴费时&#xff0c;在原有美金支付的基础上&#xff0c;开通了新的人民币付款通道&#xff0c;包含支付宝和多种信用卡支付方式&#xff0c;持证人士可以按需选择<美金USD>或<人民…

基于梯度下降神经网络训练整体流程

文章目录基于梯度下降神经网络训练整体流程梯度下降优化算法一、简介二、梯度下降方法2.1 批量梯度下降法BGD2.2 随机梯度下降法SGD三、传统梯度下降法面临的挑战四、优化器4.1 Momentum4.2 Adagrad4.3 Adam4.4 对比与选择过拟合、拟合和欠拟合一、防止过拟合方法1.1 早停基于梯…

FFMPEG Vcl Player 7.0 For Delphi Crack

FFMPEG Vcl Player For Delphi 7.0【www_flashavconverter_com】是一个基于 directshow 和 ffmpeg 的 vcl 播放器&#xff0c;用于解码和播放视频/音频。 新增&#xff1a;升级到最新的FFMPEG Runtime(5.1.x)并支持Delphi 11.2 支持 Dash 回放 支持播放AES加密网络流 Nvidia 卡…

一文搞懂MD5、SHA-1、SHA-2、SHA-3,哪个算法比较安全

MD5、SHA-1、SHA-2、SHA-3都是比较常见的单向散列函数&#xff0c;这几种单向散列函数都有自己的特性。下面&#xff0c;给大家介绍一下它们的区别&#xff0c;以及MD5、SHA-1、SHA-2、SHA-3的安全性如何&#xff0c;哪种算法比较安全&#xff1f;一、简介单向散列函数是指对不…

JavaWeb:过滤器与监听器

一、过滤器Filter 1.1 过滤器Filter概述 Filter表示过滤器&#xff0c;是JavaWeb三大组件&#xff08;Servlet、Filter、Listener&#xff09;之一。Servlet我们之前都已经介绍过了&#xff0c;Filter和Listener我们今天都会进行介绍。 过滤器可以把对资源的请求 拦截 下来&…

Python的判断语句

进行逻辑判断&#xff0c;是生活中常见的行为。 同样&#xff0c;在程序中&#xff0c;进行逻辑判断也是最为基础的功能。 布尔类型和比较运算符 布尔类型的字面量&#xff1a; true 表示真&#xff08;是、肯定&#xff09;false 表示假&#xff08;否、否定&#xff09; …

【tkinter】用不到50行Python代码,写一个扫雷小游戏

文章目录定制按钮生成雷区主流程基础知识&#xff1a;StringVartkinter布局 定制按钮 学会了布局和绑定事件&#xff0c;就可以开发一些简单的应用&#xff0c;比如扫雷小游戏。从外观来看&#xff0c;扫雷就是一个按钮矩阵&#xff0c;左键点击按钮&#xff0c;如果按钮里埋…

myBaits Target Capture Kits;myBaits 靶向捕获试剂盒,快速捕获富集目标序列

myBaits Target Capture Kits可以快速捕获富集目标序列&#xff0c;提高NGS研究效率&#xff0c;兼容Illumina&#xff0c;PacBio 和 Nanopore等多种测序平台。Arbor Biosciences使用oligo合成专利技术&#xff0c;为您提供高质量、高性价比的捕获试剂盒。适用于各种基因组类型…

pytest简介

介绍pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要有以下几个特点&#xff1a;简单灵活&#xff0c;容易上手支持参数化能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium/appnium等自动化测试、接口自动化测试&#xff08;pytestrequ…

我写了一个脚本,实现了图片分类问题模型训练的全自动化训练

众所周知,图片分类问题属于计算机视觉中比较容易解决的问题之一 但 这几天被数据集的问题搞得焦头烂额, 照理说分类问题的数据集应该比较好制作 但 如果之前没有现成的数据集 也会变得比较麻烦 直到我偶然发现了一个HuggingFace的图片搜索API 无限次调用 而且不需要身份验证 真…

如何实现报表集成?(五)——集成案例分享

在前面几篇&#xff0c;我们分别给大家介绍了报表工具的系统集成架构、用户同步/单点登录、资源集成和权限集成&#xff0c;从整体上对报表工具实现系统集成的各个方面都作了针对性的阐述。那别的用户实际上是如何做报表集成的呢&#xff1f; 这一篇&#xff0c;我们来看一下某…

408—二叉树与树

二叉树的一些概念&#xff1a;//二叉树有严格的左右子树之分&#xff0c;度数为2的树则没有对此进行要求。常见的两种二叉树&#xff1a;//如上E为满二叉树&#xff0c;每一层的结点个数都达到了当层能达到的最大结点数//满二叉树自上而下&#xff0c;从左到右依次进行编号&…

易于理解的完全立方体计算的多路数组聚集方法

自己琢磨半天终于搞懂了&#xff0c;可能是自己悟性不够吧-_-|| 多路数组聚集其实就是对维度(dimension)进行选择&#xff0c;保留一些常用的可以很方便地生成别的子立方体的立方体(cube)。对一个维做聚集(aggregation)其实就是按照这个维度的方向做加法&#xff0c;把这个维度…

Linux下的动静态库及链接

目录 常识 动态链接 静态链接 两者的比较 动态库与静态库 常识 我们平时写的代码和标准库是两回事&#xff0c;像C标准库提供给我们一些函数方便使用&#xff0c;降低程序员工作成本。比如写个printf("hello world"); 我们只是调用了库里的函数&#xff0c;并没…