多线程( Thread)

article/2025/8/7 1:23:49

 线程:是一个程序内部的一条执行流程。

多线程:是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行)。

创建线程:

多线程的创建方式之一:继承Thread类

1.定义一个子类MyThread继承线程类java.lang.Threaf,重写run()方法

2.创建MyTread类的对象

3.调用线程对象的start()方法启动线程(启动后还是执行run()方法的)

优点:编码简单

缺点:线程类已经继承了Thread,无法继承其他类,不利于功能的扩展。

如下就是一个多线程。

创建线程的注意事项:

1.启动线程必须是调用start方法,不是调用run方法。

直接调run方法会当成普通方法执行,此时相当于还是单线程执行

只有调用start方法才是启动一个新的线程执行。

2.不要把主线程任务放在启动子线程之前。

public class Test {//main方法本身 是线程,main方法就是一个线程,main方法启动了线程,main方法就是主线程public static void main(String[] args) {//创建线程的创建方式一:继承Thread类,重写run方法,调用start方法启动线程// 创建线程对象MyThread myThread = new MyThread();// 启动线程myThread.start();for (int i = 0; i < 10; i++) {System.out.println("主线程:" + i);}}
}
// 定义一个类继承Thread类,成为线程类class MyThread extends Thread{// 重写Thread类的run方法@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("线程1:" + i);}}
}

多线程的创建方法二:实现Runnable接口

public class ThreadDemo2 {public static void main(String[] args) {//sRunnable runnable=new MyRunnable();Thread t = new Thread(runnable);t.start();for (int i = 0; i < 10; i++) {System.out.println("主线程任务正在执行"+i);}}
}
//定义一个线程任务实现Runnable接口
class MyRunnable implements Runnable{@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("子线程任务正在执行"+i);}}
}

匿名内部类写法

public static void main(String[] args) {//sRunnable runnable=new Runnable(){public void run() {for (int i = 0; i < 10; i++) {System.out.println("子线程任务正在执行"+i);}}};Thread t = new Thread(runnable);t.start();for (int i = 0; i < 10; i++) {System.out.println("主线程任务正在执行"+i);}}

线程的创建方式三:实现Callable接口、FuntureTask类类实现

前两种创建方式存在问题:重写的run方法不能直接返回数据 结果。

JDK5.0提供了Callable接口和FutureTask类来实现(多线程第三种创建方式)

优点:可以返回线程执行完毕后的结果。

 

  

 public static void main(String[] args) {Callable<Integer> myCallable = new MyCallable(15);FutureTask<Integer> task = new FutureTask<>(myCallable);Thread t = new Thread(task);t.start();Callable<Integer> myCallable1= new MyCallable(20);FutureTask<Integer> task1 = new FutureTask<>(myCallable1);Thread t1 = new Thread(task1);t1.start();try {int sum = task.get();System.out.println("子线程1计算结果为:"+sum);} catch (Exception e) {e.printStackTrace();}try {int sum = task1.get();System.out.println("子线程2计算结果为:"+sum);} catch (Exception e) {e.printStackTrace();}for (int i = 0; i < 10; i++) {System.out.println("主线程任务正在执行"+i);}}
}
class MyCallable implements Callable<Integer> {int j;public MyCallable(int j) {this.j = j;}@Overridepublic Integer call() throws Exception {for (int i = 0; i < 10; i++) {j+=i;}return j;}

三种线程的创建方式不同点

线程的常见方法

Thread的常用方法

   

public class Threadmain {public static void main(String[] args) {//创建两个线程Thread t1=new MyThread1();Thread t2=new MyThread1();t1.start();t2.start();System.out.println(t1.getName());System.out.println(t2.getName());t1.setName("线程1");t2.setName("线程2");System.out.println(t1.getName());System.out.println(t2.getName());try{Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}try{t1.join();}catch(InterruptedException e){e.printStackTrace();}}
}
class MyThread1 extends Thread{public void run(){for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"正在运行"+i);}}
}

 


http://www.hkcw.cn/article/mmprayXRpB.shtml

相关文章

Vue-2-前端框架Vue基础入门之二

文章目录 1 计算属性1.1 计算属性简介1.2 计算属性示例 2 侦听器2.1 简单的侦听器2.2 深度监听2.3 监听对象单个属性 3 vue-cli3.1 工程化的Vue项目3.2 Vue项目的运行流程 4 vue组件4.1 Vue组件的三个部分4.1.1 template4.1.2 script4.1.3 style 4.2 组件之间的关系4.2.1 使用组…

LTSPICE仿真电路:(三十二)差动放大器电流源

1.差动放大器电流源 本来是和HOWLAND电流源在一起的&#xff0c;后面想着以后不一定好查找&#xff0c;不如重新另起一篇算了&#xff0c;和前一章的电流源有比较接近的地方&#xff0c;四个电阻直接变成差动放大器内部的东西。 方框中的就是差动放大器&#xff0c;也是负反馈…

Redis 缓存穿透、缓存击穿、缓存雪崩详解与解决方案

在分布式系统中&#xff0c;Redis 凭借高性能和高并发处理能力&#xff0c;成为常用的缓存组件。然而&#xff0c;在实际应用中&#xff0c;缓存穿透、缓存击穿、缓存雪崩这三大问题会严重影响系统的性能与稳定性。本文将详细解析这三个问题的成因&#xff0c;并提供对应的解决…

论文阅读笔记——Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset

I3D 论文 UCF-101&#xff08;13000多个视频&#xff09;和 HMDB-51&#xff08;7000多个视频&#xff09;数据集过小&#xff0c;提出了 Kinetics 数据集&#xff0c;并且在其之上预训练之后能够迁移到其他小的数据集。 2DLSTM&#xff1a;使用2D CNN的好处是可以直接从 Ima…

Azure devops 系统之五-部署ASP.NET web app

今天介绍如何通过vscode 来创建一个asp.net web app,并部署到azure 上。 创建 ASP.NET Web 应用 在您的计算机上打开一个终端窗口并进入工作目录。使用 dotnet new webapp 命令创建一个新的 .NET Web 应用,然后将目录切换到新创建的应用。 dotnet new webapp -n MyFirstAzu…

slider滑块async await

isselectionrangeenabled 特色属性 实际场景 视频缓存进度和观看进度 scrollbar 也可以 <StackPanel> <!-- 选择范围头尾相同&#xff0c;但 Slider 仍可操作 --> <Slider IsSelectionRangeEnabled"True" SelectionStart"30" SelectionEn…

LangChain-结合GLM+SQL+函数调用实现数据库查询(一)

业务流程 实现步骤 1. 加载数据库配置 在项目的根目录下创建.env 文件&#xff0c;设置文件内容&#xff1a; DB_HOSTxxx DB_PORT3306 DB_USERxxx DB_PASSWORDxxx DB_NAMExxx DB_CHARSETutf8mb4 加载环境变量&#xff0c;从 .env 文件中读取数据库配置信息 使用 os.getenv…

性能优化 - 工具篇:常用的性能测试工具

文章目录 Pre1. 常用的性能测试工具2. nmon —— 获取系统级性能数据2.1 安装与启动2.2 采样并生成报表 3. jvisualvm —— 获取 JVM 性能数据3.1 启动与连接3.2 CPU 分析&#xff08;Sampler & Profiler&#xff09;3.3 内存监视与 Heap Dump3.4 线程分析 4. JMC&#xff…

箱式不确定集

“箱式不确定集&#xff08;Box Uncertainty Set&#xff09;”可以被认为是一种 相对简单但实用的不确定集建模方式。 ✅ 一、什么是“简单的不确定集”&#xff1f; 在鲁棒优化领域&#xff0c;“简单不确定集”通常指的是&#xff1a; 特点描述形式直观数学表达简洁&#…

GoldenEye

GoldenEye: 1 About Release Back to the Top Name: GoldenEye: 1Date release: 4 May 2018Author: creosoteSeries: GoldenEye 下载&#xff1a; GoldenEye-v1.ova (Size: 805 MB)Download: https://drive.google.com/open?id1M7mMdSMHHpiFKW3JLqq8boNrI95Nv4tqDownload (Mir…

[AI算法] 什么事RoPE scaling

文章目录 RopeScaling 的作用&#x1f4a1; RopeScaling 的核心思想&#xff1a; 常见的 RoPE Scaling 方法Dynamic NTK-Aware Scaling核心原理实现方式&#xff08;伪代码示例&#xff09;优点与效果应用场景总结对比表 YaRN技术 RopeScaling 的作用 ✅ 场景背景&#xff1a;…

功能丰富的PDF处理免费软件推荐

软件介绍 今天给大家介绍一款超棒的PDF工具箱&#xff0c;它处理PDF文档的能力超强&#xff0c;而且是完全免费使用的&#xff0c;没有任何限制。 TinyTools&#xff08;PC&#xff09;这款软件&#xff0c;下载完成后即可直接打开使用。在使用过程中&#xff0c;操作完毕后&a…

统一多模态预训练中的涌现特性

25年5月来自字节、深圳先进技术研究院、Monash 大学、香港科大和 UC Santa Cruz 的论文“Emerging Properties in Unified Multimodal Pretraining”。 统一多模态理解与生成已在尖端专有系统中展现出令人瞩目的能力。本研究的 BAGEL&#xff0c;是一个原生支持多模态理解与生…

从认识AI开始-----Transformer:大模型的核心架构

前言 在NLP领域中&#xff0c;RNN、LSTM及GRU曾是处理序列问题的主力模型&#xff0c;但它们都面临着两个关键问题&#xff1a; 无法并行计算&#xff1a;序列数据需要完成前一步后再处理下一步&#xff0c;这会使得训练效率低下长期依赖问题&#xff1a;即使是LSTM、GRU&…

Mnist手写数字

运行实现&#xff1a; import torch from torch.utils.data import DataLoader from torchvision import transforms from torchvision.datasets import MNIST import matplotlib.pyplot as pltclass Net(torch.nn.Module):#net类神经网络主体def __init__(self):#4个全链接层…

win32相关(互斥体)

互斥体 内核级临界资源怎么处理&#xff1f; 有两个不同进程中的线程&#xff0c;访问内核中的临界资源&#xff0c;该怎么实现线程安全 互斥体其实就是一个内核级的跨进程访问令牌&#xff0c;与在同一个进程中的临界区不同的是&#xff0c;同一个进程中的不同线程&#xff0c…

【配置vscode默认终端为git bash】

配置vscode默认终端为git bash 点击左下角小齿轮&#xff0c;点击设置&#xff0c;搜索terminal.integrated.profiles.windows&#xff0c;点击在setting.json中编辑 第一部分是当前的所有的终端&#xff0c;第二部分是配置默认的终端"terminal.integrated.defaultProfi…

C# 序列化技术全面解析:原理、实现与应用场景

在软件开发中&#xff0c;数据持久化和网络通信是两个至关重要的环节。想象一下&#xff0c;当我们需要将一个复杂的对象保存到文件中&#xff0c;或者通过网络发送到另一台计算机时&#xff0c;如何有效地表示这个对象&#xff1f;这就是序列化技术要解决的问题。序列化&#…

如何检查popover气泡组件样式?调试悬停元素CSS样式的解决方案

1. 问题 当我们要检查这种弹出层的CSS样式时&#xff0c;会发现特别棘手&#xff0c;因为鼠标移走就消失了。如果是display:none控制的&#xff0c;可能还能找到&#xff0c;如果是用js通过v-if控制的&#xff0c;就无法调试了。 2. 解决方案 使用 setTimeout debugger 就…

DDR5 ECC详细原理介绍与基于协议讲解

本文篇幅较长,涉及背景原理介绍方便大家理解其运作方式 以及 基于DDR5协议具体展开介绍。 背景原理介绍 上图参考:DDR 内存中的 ECC 写入操作时,On-die ECC的工作过程如下: SoC将需要写入到Memory中的数据发送给控制器控制器将需要写入的数据直接发送给DRAM芯片在DDR5 DR…