华杉研发九学习日记23 多线程

news2024/11/16 2:59:26

华杉研发九学习日记23

java多线程

一, 线程

1.1 进程

进程就是一个程序运行的标志,是程序运行的状态。

一个正在运行的程序就是一个进程。进程是操作系统资源分配(计算资源,比如CPU,存储:内存)的最小单位。

多进程是并发执行。

在某个特定的CPU时间片中,只运行一个程序。而操作系统控制CPU,让多个程序不停的切换,从而保证多个程序能够轮流使用CPU

这就是单CPU执行多任务的原理:利用很短的CPU时间片运行程序,在多个程序之间进行CPU 时间片的进行快速切换。可以把这种运行方式总结成为一句话:宏观上并行,微观上串行。

从宏观上来看,一个系统同时运行多个程序,这些程序是并行执行的;

而从微观上说,每个时刻都只有一个程序在运行,这些程序是串行执行的。

1.2 线程

每一个程序独有很多独立的流程(功能),每一个流程就是线程。一个进程可以包含多个线程。
多个线程是相互独立,不影响的。

多线程并发执行。
多个线程在同步执行时,是以抢占式模式获取CPU的时间片来执行当前的线程。

1.3 并行和并发

并行就是在同一时刻同步执行。

并发就是在同一时间段同步执行。

1.4 单线程

如果一个进程,只有一个线程,这样的程序叫做单线程程序。

好处:资源可以最大化使用。不会出现争夺资源的问题。
缺陷:效率很低,容易阻塞。无法处理并发任务(例如:多人聊天)。

当你程序启动的时候,JVM会创建一个线程执行你的main函数,这个线程称为主线程。

1.5 多线程

如果一个进程,拥有不止一个线程。这样的程序称为多线程程序。

优势:可以同时执行多个任务。提高运行的效率。

二,java中实现多线程方式

1.继承Thread类,重写run方法

2.实现Runnable接口,实现接口中的run方法,让Runnable接口的实现类的实例对象作为Thread构造函数的target

3.通过线程池创建线程

4.实现Callable接口,实现接口中的call方法.把Callable接口的实现类对象,作为线程池的任务

2.1 使用Thread的子类

步骤:

1.创建一个子类,继承Thread类

2.重写其中的run方法(run方法定义的线程的任务)

3.创建子类对象,调用其中的start方法来启动线程(start方法是启动线程)

//  1.继承Thread类
public class Th1 extends Thread {
    //  2.重写其中的run方法
    //  线程的任务
    @Override
    public void run() {
        //  为了测试,直接使用for循环打印语句
        for(int i=1;i<=100;i++){
            System.out.println("线程1===="+i);
        }
    }
}
public class Th2 extends Th1 {
    @Override
    public void run(){
        for(int i=1;i<=100;i++){
            System.out.println("线程2--------"+i);
        }
    }
}
public class TestThread {
    public static void main(String[] args) {
        //  3.创建对象,调用start方法来启动线程
        Th1 t1 = new Th1();
        t1.start(); //  该方法一旦运行,底层会直接开启线程并调用run方法执行其任务

        Th2 t2 = new Th2();
        t2.start();
    }
}

2.2 实现Runnable接口

1.创建一个子类,实现Runnable接口

2.重写其中的run方法

3.创建子类对象

4.使用Thread来创建线程对象,同时把子类对象作为任务传入进去,调用start启动线程

public class Run1 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("--------------"+i);
        }
    }
}
public class Run2 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("========="+i);
        }
    }
}
public class TestRun {
    public static void main(String[] args) {
        //  创建对象
        Run1 run1 = new Run1();
        //  把任务对象包裹到线程中
        new Thread(run1).start();
        Run2 run2 = new Run2();
        new Thread(run2).start();
    }
}

2.3 匿名内部类实现

//  匿名内部类实现Thread
new Thread(new Runnable() {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("----------"+i);
        }
    }
}).start();
new Thread(new Runnable() {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("======"+i);
        }
    }
}).start();
Runnable runnable = ()->{
    for (int i = 0; i < 100; i++) {
        System.out.println("+++"+i);
    }
};
new Thread(runnable).start();

2.4 多线程拷贝

单线程拷贝:之前的视频拷贝都是一个视频一个视频的拷贝,只有上个视频拷贝完成,才能开启下个视频的拷贝

多线程拷贝:就是有多少个视频,每一个视频都单独开启一个线程进行读写操作

public static void copy(File from, File to){
    Runnable runnable=()->{
        try (
                //  创建对象
                BufferedInputStream br = new BufferedInputStream(new FileInputStream(from));
                BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream(to))
        ) {
            //  拷贝
            byte[] buf = new byte[1024];
            int len;
            while ((len = br.read(buf)) != -1) {
                bw.write(buf, 0, len);
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    };
    new Thread(runnable).start();

}

public static void main(String[] args) {
    File file = new File("C:\\Users\\86155\\Videos\\Counter-strike 2");
    File[] files = file.listFiles();
    for(File f : files){
        copy(f, new File("C:\\Users\\aa", f.getName()));
    }
}

三,多线程的常用方法

currentThread()获取当前线程对象。

类方法setName(String name)设置线程的名字。

getName()获取线程的名字。
如果没有设置名称,则默认名称为: Thread-N

setPriority(int priority)设置线程的优先级。优先级的取值范围[1,10].默认是5

getPriority()获取线程的优先级。

getState()获取线程的状态

join()执行该线程,会阻塞当前线程,直到该线程执行完成,当前线程才可以执行。【让行】

sleep(long millis)休眠指定时间(单位毫秒),会阻塞当前线程。类方法

start()启动线程

yield()暂停该线程的执行,交出CPU的使用权。

public static void main(String[] args) {
    Thread1 t1 =new Thread1("");
    t1.setName("窗口一");
    t1.setPriority(10);
    t1.start();
    Thread1 t2 =new Thread1("");
    t2.setName("窗口二");
    t2.setPriority(1);
    t2.start();
    Run run = new Run();
    Thread thread = new Thread(run,"小孤鸡");
    thread.start();
}
public class Thread1 extends Thread {
    String name;
    public Thread1(String name) {
        super(name);
    }
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(getName() + "-----" + i+"--"+getPriority());
        }
    }
}

四,线程的状态及生命周期

在这里插入图片描述

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

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

相关文章

Day5

BootStrap 这个玩意可以理解为&#xff0c;已经写好的css样式的封装。 在开发中&#xff0c;如果需要用到这个&#xff0c; 首先得下载下来 找到官网&#xff0c;Bootstrap中文网 (bootcss.com) 这里我下载的是最新版的v5&#xff0c; 解压后&#xff0c;把该文件夹放进项目…

计算机三级嵌入式笔记(四)——嵌入式系统软件

目录 考点1 嵌入式软件的特点 考点2 嵌入式系统的软件结构 考点3 硬件抽象层与板级支持包 考点4 引导加载程序 考点5 嵌入式系统的设备驱动程序 考点6 实时系统与实时操作系统 考点7 嵌入式操作系统概述 考点8 Linux 内核 考点9 嵌入式 Linux 操作系统 考点10 Androi…

C语言自定义类型结构体与位段超详解

文章目录 1. 结构体类型的声明1. 1 结构体声明1. 2 结构体变量的创建和初始化1. 3 结构体的特殊声明1. 3 结构体的自引用 2. 结构体内存对齐2. 1 对齐规则2. 2 为什么存在内存对齐2. 3 修改默认对齐数 3. 结构体传参4. 结构体实现位段4. 1 什么是位段4. 2 位段成员的内存分配4.…

centos7 中安装 mysql 8.x以及对数据库的管理(数据库、表的增删改查、插入删除数据)

Day 16 centos7 中安装 mysql 8.x 1.下载安装包 [rootmysql~]#wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 2.解压 tar -xf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar [rootmysql ~]# ls anaconda-ks.cfg mys…

美业收银系统【客户管理】的重要作用|美业门店管理系统Java源码、系统演示

美业系统中的客户管理功能可以起到多种作用&#xff0c;包括但不限于以下几点&#xff1a; 1.客户档案管理&#xff1a; 记录客户的个人信息、偏好、消费记录等&#xff0c;便于了解客户需求&#xff0c;提供个性化的服务和推荐。 2.预约和排队管理&#xff1a; 帮助美业从…

探索Netty框架的核心构件

Netty是一个高性能、异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可维护的高性能、高可靠性的网络服务器和客户端程序。本文将深入探讨Netty框架的基本组件&#xff0c;帮助开发者更好地理解和使用这一强大的工具。 1. 事件循环&#xff08;EventLoop&#xff09;…

告别繁琐,AI助你轻松制作PPT!2024四大工具推荐

PPT是现代商务和教育领域中不可或缺的工具。然而&#xff0c;制作一份高质量的PPT往往需要花费大量的时间和精力。AI PPT制作工具的出现可以很好地解决这一问题。下面为大家推荐几个AI PPT制作工具。 笔灵AIPPT&#xff1a;智能设计&#xff0c;一键生成 链接&#xff1a;htt…

Stable Diffusion绘画 | 文生图设置详解(二)

提示词引导系统&#xff08;CFG Scale&#xff09; 这里的参数&#xff0c;是用来控制 SD 是否严格按照输入的提示词来生成画面 CFG值越小&#xff0c;对 SD 的约束程度就越低&#xff0c;AI 会加入更多想法&#x1f4a1;&#xff0c;CFG7是一个平衡值 CFG值越大&#xff0c;对…

STL——栈和队列和优先队列

栈和队列和优先队列 概述std&#xff1a;&#xff1a;堆栈核心函数和操作成员函数示例注意事项 std&#xff1a;&#xff1a;队列核心函数和操作成员函数示例注意事项 std&#xff1a;&#xff1a;优先队列底层实现原理效率分析deque双端队列原理块结构&#xff1a;指针管理&am…

【Pytorch】一文向您详细介绍 torch.sign()

&#x1f389;&#x1f9e0;**【Pytorch】一文向您详细介绍 torch.sign()** 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff…

Java高级

类变量/静态变量package com.study.static_; 通过static关键词声明,是该类所有对象共享的对象,任何一个该类的对象去访问他的时候,取到的都是相同的词,同样任何一个该类的对象去修改,所修改的也是同一个对象. 如何定义及访问? 遵循相关访问权限 访问修饰符 static 数据类型…

Day3

首先是模板语句的学习。 在学习之前&#xff0c;我们得搞清楚为什么要学它以及学它有什么用。 Django模板语句&#xff0c;使得网页内容可以动态地从数据库中加载&#xff0c;而不是静态地写在HTML文件中。这样&#xff0c;当你需要更新网站信息时&#xff0c;只需更改模板或…

【Spark计算引擎----第二篇(RDD):一篇文章带你清楚什么是RDD?RDD的概念,RDD的特性,怎么创建一个RDD,RDD的算子】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本阶段和大家一起分享和探索大数据技术Spark—RDD&#xff0c;本篇文章主要讲述了&#xff1a;RDD的概念&#xff0c;RDD的特性&#xff0c;怎么创建一个RDD&#xff0c;RDD的算子等等。欢…

第三十一天 chrome调试工具

打开调试工具 页面空白处右击 检查 或者F12 使用调试工具 ctrl滚轮改变代码大小 左边是html 右边是css css可以直接改动数值左右箭头或者直接输入 查看颜色 ctrl0 复原浏览器大小 点击元素右侧出现样式引入 没有的话 说明类名或者样式引用错误 这里的.new-left是存在的 如果类…

OpenStack;异构算力网络架构;算力服务与交易技术;服务编排与调度技术

目录 OpenStack 一、OpenStack概述 二、OpenStack的主要组件及功能 三、OpenStack的架构 四、OpenStack的应用场景 异构算力网络架构 算力服务与交易技术 服务编排与调度技术 OpenStack 是一个开源的云计算管理平台项目,由NASA(美国国家航空航天局)和Rackspace合作…

数学建模评价类模型—层次分析法(无数据情况下)

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 本文将讲解解决评价类问题的第一种模型层次分析法&#xff08;AHP法&#xff09;&#xff0c;首先我们会具体讲解评价类问题解答的具体流程再对AHP方法进行讲解 一、评价类问题概述 评价…

DB管理客户端navicat、DBever、DbVisualizer数据库连接信息迁移

DB管理客户端Navicat、DBever、DbVisualizer数据库连接信息迁移 第三方数据库连接工具为了确保数据库信息安全通常对保存的数据库连接密码进行加密&#xff0c;填入后想再拿到原文就不可能了&#xff0c;有时交接给别人或者换电脑时可以通过连接数据导出的方式来解决。 Navic…

echarts 极坐标柱状图 如何定义柱子颜色

目录 echarts 极坐标柱状图 如何定义柱子颜色问题描述方式一 在 series 数组中定义颜色方式二 通过 colorBy 和 color 属性配合使用 echarts 极坐标柱状图 如何定义柱子颜色 本文将分享在使用 echarts 的 极坐标柱状图 时&#xff0c;如何自定义柱子的颜色。问题本身并不难解决…

URL中的中文编码与解码

URL在传输时只能使用ACSII码表示&#xff0c;且ASCII码只有128位&#xff0c;无法存储汉字等字符&#xff0c;因此对于这些非ASCII码字符需要进行编码处理&#xff0c;以保证URL的完整性 Python中urllib.parse模块提供了两个方法quote和unquote可用于URL中的中文编码与解码 以…

全网最强Docker教程 | 万字长文爆肝Docker教程

Docker 官方文档地址:https://www.docker.com/get-started 中文参考手册:https://docker_practice.gitee.io/zh-cn/ 1.什么是 Docker 1.1 官方定义 最新官网首页 # 1.官方介绍 - We have a complete container solution for you - no matter who you are and where you ar…