Java基础——多线程(一)

news2025/1/17 1:12:05

概念

线程和进程

进程:进程是程序的基本执行实体

线程:线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位

简单理解:应用软件中互相独立,可以同时运行的功能。多线程可以让程序同时做多件事情,提高效率。

应用场景:软件中的耗时操作(拷贝、迁移大文件,加载大量的资源),所有的聊天软件,所有的后台服务器

并发和并行

并发:在同一时刻,有多个指令在单个CPU上交替执行(单个CPU在多个线程之间交替执行)

并行:在同一时刻,有多个指令在多个CPU上同时执行

多线程的实现方式

继承Tread类的方式进行

Thread类表示线程

1、自己定义一个类继承Thread

2、重写run方法

3、创建子类的对象,并启动线程(用start方法)

public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + "HelloWorld");
        }
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();

        t1.setName("线程1");
        t2.setName("线程2");

        t1.start();
        t2.start();
    }
}

实现Runnable接口的方式进行实现

1、自己定义一个类实现Runnable接口

2、重写里面的run方法

3、创建自己的类的对象

4、创建一个Thread类的对象,并开启线程

public class MyRun implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            //获取当前线程的对象(哪条线程执行到这个方法,此时获取的就是哪条线程的对象)
            Thread t = Thread.currentThread();

            System.out.println(t.getName()+"HelloWorld");
        }
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
        MyRun mr = new MyRun();//创建MyRun对象表示多线程要执行的任务

        Thread t1 = new Thread(mr);//创建线程对象
        Thread t2 = new Thread(mr);
        t1.setName("线程1");
        t2.setName("线程2");

        t1.start();//开启线程
        t2.start();
    }
}

利用Callable接口和Future接口方式实现

特点:可以获取到多线程运行的结果

1、创建一个类MyCallable实现Callable接口

2、在类中重写call(是有返回值的,表示多线程运行的结果)

3、创建MyCallable对象(表示多线程要执行的任务)

4、创建FutureTask的对象(作用管理多线程运行的结果)

5、创建Thread类的对象,并启动(表示线程)

public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        //求1~100之和
        int sum = 0;
        for (int i = 0; i < 100; i++) {
            sum+=i;
        }
        return sum;
    }
}
public class ThreadDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建MyCallable对象(表示多线程要执行的任务)
        MyCallable mc = new MyCallable();
        //创建FutureTask的对象(作用管理多线程运行的结果)
        FutureTask<Integer> ft = new FutureTask<>(mc);
        //创建线程对象
        Thread t1 = new Thread(ft);
        //启动线程
        t1.start();
        //获取多线程运行的结果
        Integer result = ft.get();
        System.out.println(result);
    }
}

总结

常见的成员方法(Thread类)

setName方法:

1、如果没有给线程设置名字,线程也是有默认名字的,格式:Thread-X(X序号,从0开始)

2、如果我们要给线程设置名字,可以用set方法进行设置,也可以用构造方法设置

currentThread方法:

获取当前线程的对象,哪条线程执行到这个方法,此时获取的就是哪条线程的对象

当JVM虚拟机启动后,会自动启动多条线程其中有一条线程叫main线程,它的作用是调用main方法,并执行里面的代码

sleep方法:

1、哪条线程直行到这个方法,那么哪条线程就会在这里停留对应的时间

2、方法的参数:表示睡眠的时间,单位毫秒

线程优先级

Java中采用抢占式调度(随机):

哪条线程抢夺到执行权,就执行哪条线程

一条线程在执行过程中随时可能被其它线程抢夺走执行权,也就是说它可能还没运行完就被其他线程挤占掉,进入就绪状态

Thread类中的成员方法:

优先级高的优先运行的概率大(是概率不是一定)

守护线程

final void setDaemon(boolean on) 设置为守护线程(参数为true)

细节:当其它的非守护线程执行完毕之后,守护线程会陆续结束(注意不一定是立即结束)

礼让线程

public static void yield() 出让线程/礼让线程

Java中采用抢占式调度(随机),此方法可以让不同线程尽量均匀调度(不是一定,是尽量)

插入线程

public static void join() 插入线程

作用:把方法调用者的这个线程插入到当前线程(参数)之前

线程的生命周期

线程的状态

没有运行状态:线程运行时交给CPU,不归Java管

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

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

相关文章

C++ | Leetcode C++题解之第144题二叉树的前序遍历

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> preorderTraversal(TreeNode *root) {vector<int> res;if (root nullptr) {return res;}TreeNode *p1 root, *p2 nullptr;while (p1 ! nullptr) {p2 p1->left;if (p2 ! nullptr) {…

Nginx配置详细解释:(4)高级配置

目录 1.网页的状态页 2.Nginx第三方模块(echo) 3.变量 4.自定义访问日志 5.Nginx压缩功能 6.https功能 7.自定义图标 Nginx除了一些基本配置外&#xff0c;还有一些高级配置&#xff0c;如网页的状态&#xff0c;第三方模块需要另外安装&#xff0c;支持变量&#xff0c…

SpringTask-Timer实现定时任务

1、Timer 实现定时任务 1.1、JDK1.3 开始推出定时任务实现工具。 1.2、API 执行代码 public static void main(String[] args) throws ParseException {Timer timer new Timer();String str"2024-06-10 23:24:00";Date date new SimpleDateFormat("yyyy-MM…

【docker】日志

ocker 日志相关的操作主要涉及查看、管理和理解容器的日志输出。以下是一些常用的 Docker 日志命令和选项&#xff1a; 查看日志 docker logs container_id_or_name&#xff1a;获取指定容器的日志。docker logs -f container_id_or_name&#xff1a;跟随&#xff08;实时输出…

idea开发java高校社团推广管理系统springboot框架web结构java编程计算机网页LayUI技术

一、源码特点 java 高校社团推广管理系统是一套完善的完整信息系统&#xff0c;结合java web开发springboot框架和LayUI框架完成本系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要…

使用Vue CLI在其他磁盘创建项目出现错误及解决

Vue CLI是Vue.js官方推出的脚手架工具&#xff0c;可以帮我们快速的创建Vue项目框架。 我们创建Vue项目时一般默认都是在C盘&#xff0c;但由于某些因素我们需要在其他磁盘上创建Vue项目。 通过“winr”打开终端时默认位置都是C盘&#xff0c;但是Vue CLI不接受绝对路径作为参…

C++ | Leetcode C++题解之第143题重排链表

题目&#xff1a; 题解&#xff1a; class Solution { public:void reorderList(ListNode* head) {if (head nullptr) {return;}ListNode* mid middleNode(head);ListNode* l1 head;ListNode* l2 mid->next;mid->next nullptr;l2 reverseList(l2);mergeList(l1, l…

OpenCV 双目三角法计算点云

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 基于三角法计算点坐标的过程类似于我们人类眼睛观察事物的过程: 如上图所示,通过两个相机观察到同一位置,我们可以通过两个相机得到这一位置的投影坐标 ( u r , v r ) , ( u l , v l )

IDEA:配置Golang的开发环境

1、下载&安装 进入GO的官网下载对应的GO 我们可以下载安装版&#xff0c;不过本人习惯下载解压版&#xff0c;这个因个人而异 2、配置环境变量 GOBIN : %GOROOT%\bin GOPATH : D:\MyGo 工作区间 GOROOT : D:\Program Files\Go GOJDK地址PATH: %GOBIN% ; %GOROOT%\bin ; …

Django模板的使用(详细版)

1、配置 在工程中创建模板目录templates&#xff08;这个名字可以变&#xff01;&#xff01;&#xff09; 在settings.py配置文件中修改TEMPLATES配置项的DIRS值 2、定义模板 在templates目录中新建一个模板文件&#xff0c;如index.html 3、模板渲染 Django提供了一个函数…

lua对接GPT4实现对话

演示效果&#xff1a; 准备材料&#xff1a; 1、FastWeb网站开发服务&#xff1a;fwlua.com 2、一台服务器 该示例使用开源项目&#xff1a;fastweb 实现。 代码比较简单&#xff0c;主要是两部分&#xff0c;一个lua代码和一个html页面&#xff0c;用来用户发起请求和后台…

【Bazel入门与精通】 rules之属性

https://bazel.build/extending/rules?hlzh-cn#attributes Attributes An attribute is a rule argument. Attributes can provide specific values to a target’s implementation, or they can refer to other targets, creating a graph of dependencies. Rule-specifi…

LeetCode 算法:矩阵置零c++

原题链接&#x1f517;&#xff1a;矩阵置零 难度&#xff1a;中等⭐️⭐️ 题目 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1…

13. UDP协议与RTP协议

UDP协议 UDP协议比较简单&#xff1a; UDP的长度是固定的&#xff0c;用总长度-UDP长度就是数据长度。 UDP是不保证他的有序性和可靠性的。对于音频和视频是这样是比较好的&#xff0c;因为这段丢了&#xff0c;我们可以从下一段在开始解码。 RTP RTP 协议概述 RTP&#x…

【讲解下Chrome DevTools,什么是Chrome DevTools?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

C语言 | Leetcode C语言题解之第143题重排链表

题目&#xff1a; 题解&#xff1a; struct ListNode* middleNode(struct ListNode* head) {struct ListNode* slow head;struct ListNode* fast head;while (fast->next ! NULL && fast->next->next ! NULL) {slow slow->next;fast fast->next-&g…

109.网络游戏逆向分析与漏洞攻防-装备系统数据分析-商店与捨取窗口数据的处理

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…

CA证书及PKI

文章目录 概述非对称加密User Case: 数据加密User Case: 签名验证潜在问题 CACA证书的组成CA签发证书流程CA验证签名流程CA吊销证书流程 PKI信任链证书链 概述 首先我们需要简单对证书有一个基本的概念&#xff0c;以几个问题进入了解 ❓ Question1: 什么是证书&#xff1f; 证…

[大模型]GLM-4-9b-Chat 接入 LangChain

环境准备 在 01-ChatGLM4-9B-chat FastApi 部署调用 的 环境准备和模型下载基础上&#xff0c;我们还需要安装 langchain 包。如果不需要使用fastapi相关功能&#xff0c;则可以不安装 fastapi、uvicorn、requests。 pip install langchain0.2.1注意langchain这里使用2024年5…

idea如何使用git reset进行回退以及如何使用git stash将暂存区文件储藏,打包后重新恢复暂存区文件

最近遇到一个棘手的问题&#xff0c;本来按照计划表开发&#xff0c;但是项目经理突然让你改一个小bug&#xff0c;改完需要马上部署到线上&#xff0c;但是你手上的活做到一半还没做完&#xff0c;提交上去那肯定是不可行的。这时就可以使用git stash命令先把当前进度&#xf…