多线程---创建线程

1.概述

多线程是指从软件或者硬件上实现多个线程并发执行的技术。线程是程序中独立运行的程序片段,每个线程都有独立的执行流程,可以在同一时间内执行不同的任务。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。

多线程是并行化的一种形式,或者是拆分工作以便同时进行处理。线程化的程序将工作拆分到多个软件线程,而不是将大量工作交给单个内核。这些线程由不同的CPU内核并行处理,以节省时间。多线程可以提高程序的并发性和效率,实现异步处理,提高程序的响应速度和用户体验。

2.Thread类常用方法

  1. start():启动当前线程,使其进入就绪状态,等待CPU调度执行。调用该方法将自动调用线程的run()方法。
  2. run():线程执行的具体操作就在这个方法中定义。通常,我们会通过继承Thread类或实现Runnable接口来重写这个方法。
  3. currentThread():这是一个静态方法,用于返回当前正在执行的线程对象。
  4. getName():获取当前线程的名字。
  5. setName(String name):设置当前线程的名字。注意,这个设置通常在调用start()方法之前进行。
  6. yield():使当前线程放弃CPU的执行权,让其他线程有机会执行。这并不意味着当前线程不再执行,而是让出CPU时间片,等待下一次调度。
  7. join():在线程A中调用线程B的join()方法,会导致线程A等待,直到线程B执行完毕。这可以用来实现线程之间的同步。
  8. sleep(long millis):让当前线程休眠指定的毫秒数。在这段时间内,线程不会执行任何操作,也不会被调度。
  9. isAlive():判断当前线程是否还在执行。如果线程已经结束,该方法将返回false。
  10. interrupt():中断当前线程。如果线程正在执行阻塞操作(如sleep、wait、join等),中断会使其收到一个InterruptedException异常。

3.创建多线程的三种方式

创建子线程图解:

1. 继承Thread类:

实现步骤:

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

public class MyThread extends Thread {

    @Override
    public void run(){
         for(int i=0;i<10;i++){
             System.out.println("子线程"+i);
         }
    }
}

2.实例化Thread类

3.启动线程

public class CreateThread01 {
    public static void main(String[] args) {
        Thread Thread = new MyThread();//创建线程
        Thread.start();//启动线程线程

        for(int i=0;i<10;i++){

            System.out.println("主线程"+i);
        }
    }
}

2.实现Runnable接口:

实现Runnable接口的类作为任务类然后通过Thread类的实例来运行这个任务类。这种方式更推荐,因为它避免了单一继承的限制,更便于共享资源。

实现步骤:

1.实现Runnable接口,重写run方法

public class MyRunable implements Runnable {
    @Override
    public void run() {
        for(int i=0;i<10;i++){

            System.out.println("子线程"+i);
        }
    }
}

2.实例化Runable类

3.传入Runable类参数实例化Thread类

4.启动线程

public class CreateThread02 {
    public static void main(String[] args) {
       //写法一
       // Runnable runable = new MyRunable();//实例化Rubable的子类,创建任务对象
     
//        new Thread(runable).start();//创建线程,将任务对象交给线程对象处理并启动线程
        //写法二,接口的匿名类写法
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=0;i<10;i++){
                    System.out.println("子线程"+i);
                }
            }
        }).start();

        for(int i=0;i<10;i++){
            System.out.println("主线程"+i);
        }
    }
}

3.利用Callable接口:

Callable接口是类似于Runnable的接口,实现Callable接口的类和实现Runnable接口的类都是可以被其它线程执行的任务。通过实现Callable接口可以获取返回值,并可以抛出异常。

实现步骤:

1.实现Callable接口重写call方法并通过泛型指定返回值类型,这里的call类似run方法。

import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {
    private int n;
    MyCallable(int n){
        this.n=n;
    }
    @Override
    public String call() throws Exception {

        int sum=0;
        for(int k=0;k<n;k++){
            sum++;
        }
        return Thread.currentThread().getName()+"执行结果"+sum;
    }
}

2.实例化未来任务类FutureTask

3.实例化Thread类来运行未来任务类

4.启动线程

5.获取返回值

import jdk.nashorn.internal.codegen.CompilerConstants;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class CreateThread03 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建Callable对象
        Callable<String> callable = new MyCallable(100);
        //创建未来任务对象
        FutureTask<String> f1=new FutureTask(callable);
        //封装任务对象并启动线程
        new Thread(f1,"子线程1").start();
        //获取线程执行结果
        System.out.println(f1.get());

        Callable<String> callable2 = new MyCallable(200);
        FutureTask<String> f2=new FutureTask(callable2);
        new Thread(f2,"子线程2").start();
        System.out.println(f2.get());
    }
}

执行结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SITLE24V2BNQ-3/TR瞬态电压抑制器

SITLE24V2BNQ是一种瞬态电压抑制器&#xff0c;设计用于保护两个汽车控制器区域 网络(CAN)母线不受ESD等瞬变造成的损坏。 SITLE24V2BNQ采用SOT-23封装。标准产品不含铅和卤素。

openGauss学习笔记-222 openGauss性能调优-系统调优-操作系统参数调优

文章目录 openGauss学习笔记-222 openGauss性能调优-系统调优-操作系统参数调优222.1 前提条件222.2 内存相关参数设置222.3 网络相关参数设置222.4 I/O相关参数设置 openGauss学习笔记-222 openGauss性能调优-系统调优-操作系统参数调优 在性能调优过程中&#xff0c;可以根据…

第6个-滚动动画

Day 6 - Scroll Animation 1. 演示效果 2. 分析思路 布局 所有的内容进行水平垂直居中&#xff0c;可以使用**margin:0 auto;&#xff0c;也可以使用flex**布局&#xff1a; body {background-color: #efedd6;display: flex;flex-direction: column;justify-content: center…

计算机服务器中了_locked勒索病毒怎么办?Encrypted勒索病毒解密数据恢复

随着网络技术的不断发展&#xff0c;数字化办公已经成为企业生产运营的根本&#xff0c;对于企业来说&#xff0c;数据至关重要&#xff0c;但网络威胁无处不在&#xff0c;近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服务器遭到了_locked勒索…

GPT4微信机器人部署,集成gpt4问答、midjourney以及新闻等联网功能,免费可添加机器人成为自己专属助理

GPT问答和midjourney作为AI届两大亮点&#xff0c;都各自有官方体验方式。 同时&#xff0c;也有很多大神搭建了各类软件、平台供用户体验使用。 但是如果同时将GPT问答和midjourney集合到日常最常使用的微信呢&#xff1f; 打造一个微信机器人&#xff0c;不仅自己可以随时…

Halcon 相机标定

文章目录 算子单相机标定单相机标定畸变的矫正 算子 gen_caltab 生成标定文件 gen_caltab(::XNum,YNum,MarkDist,DiameterRatio,CalTabDescrFile,CalTabPSFile :) 算子来制作一个标定板XNum 每行黑色标志圆点的数量。YNum 每列黑色标志圆点的数…

自然语言编程系列(二):自然语言处理(NLP)、编程语言处理(PPL)和GitHub Copilot X

编程语言处理的核心是计算机如何理解和执行预定义的人工语言&#xff08;编程语言&#xff09;&#xff0c;而自然语言处理则是研究如何使计算机理解并生成非正式、多样化的自然语言。GPT-4.0作为自然语言处理技术的最新迭代&#xff0c;其编程语言处理能力相较于前代模型有了显…

Attention Is All Your Need论文翻译

0.摘要 这个统治序列转换模型是基于复杂循环或者卷积神经网络&#xff0c;它包含编码器和解码器。表现最好的模型也通过注意力机制来连接编码器和解码器。我们提出了一个新的简单网络架构——Transformer,它仅仅是是基于注意力机制&#xff0c;完全免去递推和卷积。在两个机器…

Docker基础篇

docker 三个要素 镜像容器仓库 CentOS 6.8 安装 docker centos 7.0 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager -y --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo systemctl start docker

『运维备忘录』之 APT 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱12(附带项目源码)

效果演示 文章目录 效果演示系列目录前言悬停显示物品详情源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xff0c;我们将探索如何用unity制作一个3D背包、库存、制作、快…

【感知机】感知机(perceptron)学习算法的对偶形式

感知机( perceptron )是二类分类的线性分类模型&#xff0c;其输入为实例的特征向量&#xff0c;输出为实例的类别&#xff0c;取1 和-1二值。感知机对应输入空间(特征空间)中将实例划分为正负两类的分离超平面&#xff0c;是一种判别模型。感知机是神经网络与支持向量机的基础…

GPT-4助力我们突破思维定势

GPT-4在突破思维局限、激发灵感和促进知识交叉融合方面的作用不可小觑&#xff0c;它正逐渐成为一种有力的工具&#xff0c;助力各行业和研究领域的创新与发展。 GPT-4在突破传统思维模式、拓宽创新视野和促进跨学科知识融合方面扮演着越来越重要的角色&#xff1a; 突破思维…

【JAVA】List.addAll 详解

List.addAll() 方法是 Java 中 List 接口提供的一个用于向一个 List 集合中添加另一个 List 集合中所有元素的方法。该方法可以方便地将一个 List 集合中的元素添加到另一个 List 集合中&#xff0c;从而使得代码变得更加简洁&#xff0c;功能更加优秀。 一、使用List.addAll方…

Vue首屏优化,12个提速建议

文章目录 代码拆分和懒加载&#xff1a;代码拆分懒加载 图片优化&#xff1a;组件懒渲染&#xff1a;数据预获取和缓存&#xff1a;服务器端渲染&#xff08;SSR&#xff09;&#xff1a;代码压缩和合并&#xff1a;使用 CDN 加速&#xff1a;监控和性能分析&#xff1a;代码优…

SpringBoot+Vue项目部署上线

部署前准备 注册京东云 京东云: https://www.jdcloud.com/ 117.72.32.65vue本地部署 新建文件.env.development VUE_APP_BASEURLhttp://localhost:9191新建文件 .env.production VUE_APP_BASEURLhttp://117.72.32.65:9191main.js 设置全局变量$baseUrl Vue.prototype.$baseUrl…

《学成在线》微服务实战项目实操笔记系列(P92~P120)【下】

史上最详细《学成在线》项目实操笔记系列【下】&#xff0c;跟视频的每一P对应&#xff0c;全系列18万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。 四、课程发布模块 4.1 (课程发布)模块需求…

ElementUI Form:Cascader 级联选择器

ElementUI安装与使用指南 Cascader 级联选择器 点击下载learnelementuispringboot项目源码 效果图 el-cascader.vue&#xff08;Cascader 级联选择器&#xff09;页面效果图 项目里el-cascader.vue代码 <script> let id 0; export default {name: el_cascader,dat…

MySQL数据库基础(五):SQL语言讲解

文章目录 SQL语言讲解 一、SQL概述 二、SQL语句分类 1、DDL 2、DML 3、DQL 4、DCL 三、SQL基本语法 1、SQL语句可以单行或多行书写&#xff0c;以分号结尾 2、可使用空格和缩进来增强语句的可读性 3、MySQL数据库的SQL语句不区分大小写&#xff0c;关键字建议使用大写…

数据结构-邻接矩阵

介绍 邻接矩阵&#xff0c;是表示图的一种常见方式&#xff0c;具体表现为一个记录了各顶点连接情况的呈正方形的矩阵。 假设一共有以下顶点&#xff0c;其连接关系如图所示 那么&#xff0c;怎么表示它们之间的连接关系呢&#xff1f; 我们发现&#xff0c;各条边所连接的都…