JAVA基础 day13 多线程

news2024/12/29 8:57:42

一、多线程

1.1多线程的创建方法?


1.1.1方式一:继承Thread类

//创建线程的方式之一:继承Thread类
public class demo1 {
    //main方法本身是由一条主线程推进,这里创建了myThread后,已经是多线程了
    public static void main(String[] args) {
        //3.创建一个线程对象,他才是真正代表一个线程
        MyThread myThread = new MyThread();
        //4.调用start方法,启动该线程
        myThread.start();

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


    }
}
//1.定义一个子类来继承thread类,就可以成为一个线程
class MyThread extends Thread{
    //2.重写继承自thread的run方法,run方法是你要使用该线程完成的功能
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + "子线程" + i);
            System.out.println("\n");
        }
    }

}

注意事项

主线程若放在启动子线程之前, 是会先跑完主线程任务,再启动子线程,相当于没有实现多线程。

1.1.2 方式二:实现Runnable接口

//创建线程的第二种方法
public class BuildMethod_2 {
    public static void main(String[] args) {
        //3.创建线程任务类对象,代表线程任务
        myThread_Build r = new myThread_Build();
        //4.把线程任务对象,交给一个线程对象处理
        Thread t = new Thread(r);
        //5.启动线程
        t.start();

        for(int i = 0; i < 10; i++){
            System.out.println("主线程" + i);
        }
    }
}
//1.定义一个类,来实现runnable接口
class myThread_Build implements Runnable {
    //2.重写run方法,创建线程任务
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("子线程" + i);
        }
    }
}

匿名内部类写法:

//使用runnable接口的匿名内部类 + lambda 来简化线程创建
public class Runable_lmbda {
    public static void main(String[] args) {
        new Thread(()-> {
                for (int i = 0; i < 10; i++) {
                    System.out.println("子线程" + ":" + i)
                }
            }).start();
    }
}

1.1.3 方式三:实现Callable接口

前两种方式都有一个问题:重写后的run方法,无法返回直接返回结果

由此引出第三种方式:实现callable接口+FutureTask类,可以返回线程执行完后的结果

//实现callable + futureTask类创建线程
public class Method3_Callable {
    public static void main(String[] args) {
        //3.创建一个实现类对象,来代表线程任务
        Callable my_call = new MyCallable(200);
        //4.把callable的任务对象,包装成FutureTask对象
        FutureTask<String> my_future = new FutureTask<String>(my_call);
        /*
        未来任务对象的作用:
        a.本质是一个runnable线程任务对象,可以交给thread线程任务对象处理
        b.可以获取线程运行后的结果
         */
        //5.把FutureTask对象作为参数,传给thread线程对象
        Thread my_thread = new Thread(my_future);
        //6.使用线程的start方法,启动线程
        my_thread.start();

        //3.创建一个实现类对象,来代表线程任务
        Callable my_call2 = new MyCallable(100);
        //4.把callable的任务对象,包装成FutureTask对象
        FutureTask<String> my_future2 = new FutureTask<String>(my_call2);
        Thread my_thread2 = new Thread(my_future2);
        my_thread2.start();

        //获取线程运行后的结果:使用FutureTask的get方法
        try {
            //如果主运行到这里,发现子线程任务还没跑完,他会让出cpu,等着子线程执行完
            System.out.println(my_future.get());
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            System.out.println(my_future2.get());
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}
//1.定义一个实现类,实现callable接口 这是一个泛型接口,实现的时候要声明返回值类型
class MyCallable  implements Callable<String> {

    private final int num;
    public MyCallable(int num) {
        this.num = num;
    }

    public String call() throws Exception {
        int sum = 0;
        for (int i = 1; i <= num; i++) {
            sum += i;
        }
        return "子线程计算1到"+ "num" + "的结果是" + sum;


    }
}

1.2 多线程的常用方法

2.线程安全

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

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

相关文章

瑞_RabbitMQ_Java客户端SpringAMQP

文章目录 1 初识MQ2 RabbitMQ2.1 安装2.1.1 资源准备2.1.2 安装步骤 3 Java客户端SpringAMQP3.1 导入Demo工程&#xff08;含资源&#xff09;3.2 快速入门3.2.0 准备工作3.2.1 消息发送 publisher3.2.2 消息接收 consumer3.2.3 测试 3.3 WorkQueues模型3.3.0 准备3.3.1 消息发…

Vue3获取ref元素的几种方式

静态绑定 获取单个 dom 元素 v-for 中使用 需要注意的是&#xff0c;访问的时候&#xff0c;要确保 ref 引用值已经成功绑定上元素&#xff0c;我们可以使用以下几种方式确保获取

【jeston】torch相关环境安装

参考&#xff1a;玩转NVIDIA Jetson &#xff08;25&#xff09;— jetson 安装pytorch和torchvision 我的jeston信息&#xff1a; torch install 安装环境 conda create -n your_env python3.8 conda activate your_envpytorch_for_jeston 安装.whl文件 验证&#xff1…

Opencv:EignFace算法实现人脸识别

目录 简介 代码实现 结果展示 简介 EigenFace算法是人脸识别领域中的一种经典算法&#xff0c;它基于主成分分析&#xff08;PCA&#xff09;的原理&#xff0c;通过对人脸图像进行特征提取和降维&#xff0c;从而实现对人脸的有效识别。 EigenFace算法的核心思想是将人脸图…

从零实现高并发内存池

目录 1. 项目介绍1.1 这个项目具体功能是什么&#xff1f;1.2 本项目的知识储备 2. 什么是内存池2.1 池化技术2.2 内存池主要解决的问题2.3 malloc 3. 定长内存池设计4. 高并发内存池整体框架设计4.1 Thread Cache的设计思路4.2 Central Cache的设计思路4.3 Page Cache的设计思…

MySQL数据的导入

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

(36)高分辨率频谱——通过在时域序列后面补零提高频域分辨率

文章目录 前言一、仿真分析较少的采集数据1.MATLAB代码2.仿真结果 二、高分辨率频谱1.有限信号样本高分辨率频谱的计算方法2.仿真结果 前言 在实际工程应用中&#xff0c;我们很多时候所能采集的信号并不正好是整周期的。此时若对信号做傅里叶变化&#xff0c;得到的结果中包含…

跨境电商不同节点的物流配送实现

由于涉及到国际运输、清关、仓储和本地配送等复杂环节,跨境物流与国内物流有着显著区别。本文将详细介绍跨境电商的不同物流配送模式,以及从头程到尾程各个节点的实现过程,并讨论相应的电商ERP系统在各个环节中的设计要点。 一、跨境电商的物流配送模式 跨境电商的物流配送…

【C】分支与循环2--while/for/do-while/goto以及break和continue在不同循环中的辨析~

分支与循环 while循环 if与while的对比 if(表达式)语句&#xff1b;while(表达式)语句&#xff1b;下面来看一个例子&#xff1a; 用 if 写&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {if (1)printf("hehe");//if后面条…

数据结构——排序(2)

数据结构——排序(2) 文章目录 数据结构——排序(2)前言&#xff1a;1.快速排序&#xff08;非递归版本&#xff09;基本步骤&#xff1a;代码实现 2.归并排序算法思想&#xff1a;核心步骤&#xff1a;代码实现&#xff1a;特征总结&#xff1a; 3.计数排序&#xff08;非比较…

跨境电商独立站的本地化

随着全球电商的快速发展,越来越多的跨境电商选择建立独立站以摆脱平台限制,打造品牌影响力。独立站的成功不仅依赖于技术能力和供应链管理,更取决于对目标市场的本地化策略。 本文将从网站建设、商品信息展示、SEO推广等方面分析跨境电商独立站如何进行本地化适配,并讨论如…

SMARTFORM 条形码和二维码

本文主要是记录了二维码和条形码的创建以及在SMARTFORMS的使用 文章目录 SMARTFORM 条形码创建新的BARCODE创建条形码样式创建段落样式SMARTFORM调用条形码 SMARTFORM 二维码创建二维码Module Size 调节二维码的尺寸Module Size: 像素值ErrCorrLev : 容错率二维码的使用 SMARTF…

Springboot3+druid+jasypt+application.yml配置文件数据库密码加密技术

说明 开发环境我们经常把数据库密码直接明文暴露在配置文件中,但是在生产环境,出于安全考虑,必须对数据库密码进行加密。 Jasypt是一个简单易用的Java加密工具库。Jasypt支持多种加密算法,如AES、SHA512、AES_256等,以适应不同的安全需求,可以轻松将加密技术应用于配置…

虚拟机错误:‘VirtualBox Host-Only Ethernet Adapter #2‘

这个错误确实让我很难受。同时我也找了很多的方法&#xff0c;最终得到了这种方法是比较有效的。 参考 https://www.virtualbox.org/ticket/16807

2023年“网络建设与运维”广西省赛试题复盘

2023年“网络搭建与应用”省赛试题复盘 第一部分&#xff1a;网络搭建及安全部署项目 &#xff08;500分&#xff09; 一、竞赛内容分布 “网络搭建与应用”竞赛共分二个部分&#xff0c;其中&#xff1a; 第一部分&#xff1a;网络搭建及安全部署项目 第二部分&#xff1a;服…

Uncaught (in promise) TypeError: Cannot convert object to primitive value

使用vue3的时候报了这个错误&#xff0c;而且还同时报了一个警告 说一下我这里这个错误和警告的原因&#xff0c;是因为我把传给 第三方组件的值 也当做了 第三方组件的 ref&#xff0c;可能没太说清楚&#xff0c;所以接下来看代码&#xff0c;我这里使用的第三方组件是 vxe-t…

Vue2项目中使用 echarts(5.2.2)图表组件含代码(二)

1.图表预览 2.注释说明 Vue 的组件开发 通过 props 定义外部传入的属性&#xff0c;例如 className、width、height、autoResize、chartData 等。使用 Vue 的生命周期钩子函数 mounted 进行 ECharts 的实例化&#xff0c;确保组件加载完毕后才初始化图表。通过 watch 监听 ch…

半小时速通RHCSA

1-7章: #01创建以上目录和文件结构&#xff0c;并将/yasuo目录拷贝4份到/目录下 #02查看系统合法shell #03查看系统发行版版本 #04查看系统内核版本 #05临时修改主机名 #06查看系统指令的查找路径 #07查看passwd指令的执行路径 #08为/yasuo/ssh_config文件在/mulu目录下创建软链…

【Vue】Vue扫盲(四)组件化思想与简单应用

【Vue】Vue扫盲&#xff08;一&#xff09;事件标签、事件修饰符&#xff1a;click.prevent click.stop click.stop.prevent、按键修饰符、及常用指令 【Vue】Vue扫盲&#xff08;二&#xff09;指令&#xff1a;v-for 、v-if、v-else-if、v-else、v-show 【Vue】Vue扫盲&…

Oracle-19g数据库的安装

简介 Oracle是一家全球领先的数据库和云解决方案提供商。他们提供了一套完整的技术和产品&#xff0c;包括数据库管理系统、企业级应用程序、人工智能和机器学习工具等。Oracle的数据库管理系统是业界最受欢迎和广泛使用的数据库之一&#xff0c;它可以管理和存储大量结构化和…