Java多线程的创建

永不消逝的电波 -GSM空口信号的接收与解码 一开始接触软件无线电应该是从很早之前对RFID洗衣卡的解密开始的,后来接触人员定位,慢慢的打开了这样一扇大门。。。。 翻到之前做的GSM信号的接收解码,今天就对其过程做一个记录,也不是什么新颖的内容,权当是记录和回忆了。 对于GSM网络的相关内容,不是非常的熟悉,如有不正确的,欢迎批评指正。 阅读详情

做实验的过程中需要用到多线程,许久不用有点儿生疏了,现在查资料做个多线程创建的方法记录。

Java使用线程大致有以下四种方法:

  • 继承Thread类,重写run方法。(Thread类本身也实现了Runnable接口)
  • 实现Runnable接口,重写run方法。
  • 实现Callable接口,重写call方法(有返回值)
  • 使用线程池(有返回值)

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

每次创建一个新的线程,都需要新建一个Thread子类的对象。
一个线程调用两次start()方法将会抛出线程状态异常。
继承Thread类的方式是多个线程各自完成各自的任务。
创建线程实际调用的是父类Thread空参的构造器。

public class Test {
	public static void main(String[] args) {
		for (int i = 0; i < 10; i++) {
			MyThread thread = new MyThread();
			thread.satrt();
		}
		System.out.println("This is main thread");
	}
}

public class MyThread extends Thread {
	@Override
	public void run() {
		System.out.println("This is MyThread.");
	}
}

2.实现Runnable接口,重写run()方法

覆写Runnable接口实现多线程,可以避免单继承局限。不论创建多少个线程,只需要创建一个Runnable接口实现类的对象。
创建线程实际调用的Thread类Runnable类型参数的构造器。
实现Runnable接口的方法是多个线程共同完成一个任务。

public class Test {
	public static void main(String[] args) {
		Task task = new Task();
		for (int i = 0; i < 10; i++) {
			Thread thread = new Thread(task);
			thread.satrt();
		}
		System.out.println("This is main thread");
	}
}

public class Task implements Runnable {
	@Override
	public void run() {
		System.out.println("This is MyThread.");
	}
}

3.实现Callable接口,重写call()方法

自定义类实现Callable接口时,必须指定泛型,该泛型即返回值的类型。
每次创建一个新的线程,都需要创建一个新的Callable接口的实现类。
启动线程的过程:

  • 创建一个Callable接口的实现类的对象实例。
  • 创建一个FutureTask对象,传入Callable类型的参数。
  • 调用Thread类重载参数为Runnable的构造器创建Thread对象,将FutureTask作为参数传入。
    线程允许完后获取返回值:
  • 使用FutureTask的get()方法。
public class Test {
	public static void main(String[] args) {
		for (int i = 0; i < 10; i++) {
			Task task = new Task();
			FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
            Thread thread = new Thread(futureTask);
            thread.start();
            try {
                System.out.println("The result is : " + futureTask.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
		}
		System.out.println("This is main thread");
	}
}

public class Task implements Callable<Integer> {
	@Override
	public Integer call() {
		int result = 0;
		for (int i = 0; i < 10000; i++)
			result += i;
		return result;
	}
}

FutureTask的get()方法在调用的时候会阻塞,直到当前的线程完成运行后将结果返回。

4.使用线程池

在java.util.concurrent包下,提供了一系列与线程池有关的类。合理使用线程池,可以带来诸多好处:

  • 降低资源消耗,通过重复利用已创建的线程来降低线程创建和销毁造成的消耗。
  • 提高响应速度,当任务到达时,任务可以不必等到新线程创建就能立即运行。
  • 提高线程的可管理性,线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控。
    线程池可以应对突然大爆发的访问,通过有限个固定线程为大量的操作服务,减少创建和销毁线程所需的时间。
    使用线程池的过程:
  • 创建线程池。
  • 创建任务。
  • 执行任务。
  • 关闭线程池。

这里使用一个固定大小的线程池来举例子。

public class Test {

	private static final int THREAD_POOL_SIZE = 5;

	public static void main(String[] args) {
		ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
		Task task = new Task();
		FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
		executorService.submit(futureTask);
		executorService.shutdown();
		try {
			System.out.println("The result is : " + futureTask.get());
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
		System.out.println("This is main thread");
	}
}

public class Task implements Callable<Integer> {
	@Override
	public Integer call() {
		int result = 0;
		for (int i = 0; i < 10000; i++)
			result += i;
		return result;
	}
}

5.对比

可以将java中的线程创建方式分为两大类:一类是继承Thread类实现多线程;另一类是通过实现Runnable或者Callable接口实现多线程。
下面来分析一下这两类实现多线程方式的优劣:

通过继承Thread实现多线程

  • 优点
    1.实现简单,而且要获取当前线程,无需调用Thread.currentThread()方法,直接使用this即可获取当前线程。
  • 缺点
    1.线程已经继承了Thread类了,就不能继承其他类。
    2.多个线程不能共享同一份资源。

通过实现Runnable或Callable接口实现多线程

  • 优点
    1.线程类只是实现了接口,还可以继承其他类。
    2.多个线程可以使用同一个target对象,适合多个线程处理同一个任务的情况。
  • 缺点
    1.较第一类方法,编程较为复杂。
    2.要访问当前线程,必须使用Thread.currentThread()方法。

综上 :使用第二类方法较多!

若依ruoyi框架实现单点登录或者接入统一认证 log.info("单点登录用户[{}]不存在, 需要创建.", loginName);log.info("单点登录用户[{}]已存在.", loginName);jsonObjectData.put("nickName","单点1");if (code.equals("0")) {//验证成功需要自动登录。jsonObject.put("msg","验证成功");ajax.put("msg", "登录成功"); 阅读详情

相关推荐

基于java实现的弹幕视频网站

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示弹幕视频网站,在弹幕视频网站可以查看首页、视频信息、商品信息、论坛信息、我的、跳转到后台、购物车、客服等内容前台首页界面图登录,通过登录填写账号、密码等信息进行登录操作登录界面图视频信息界面图。

DC5621的博客 1333

python多线程之事件触发(线程间通信)

#coding:utf-8 importthreading event=threading.Event() defa(): print("我是第一个线程函数a,我在等待函数b来触发我...") event.wait() print("函数a说:尼玛!我被函数b给触发了...") defb(): print("我是第二个线程函数b...

weixin_33725515的博客 420

基于yolov5的鸟类图像准确识别

本项目主要基于yolov5进行鸟类准确识别,主要识别白鹭家族,红脚鹬,反嘴鹬,环颈珩,小白鹭以及夜鹭六类鸟

weixin_46064184的博客 3823

QT 线程之 QtConcurrent::run()

用法: pro 添加 QT += concurrent 头文件 #include 定义线程函数 全部变量 int t = 0 QFuture<int>funIr int TestThread::fun1(QString str) { while(t<3){ qDebug() <<str<< t++ <<QThread::currentThreadId()<< endl;

我不是码农的博客~~~ 1429

ubuntu20.4源码安装最新gcc(gcc V12.2)

Ubuntu20.4自带的gcc为V9.4.0的版本,老版本的gcc存在不支持新版本C语言规范,在配置、编译、安装应用软件或工具时,可能存在不能正确安装的问题。(比如:libpqxx-7.7.4在配置时要求c++17版本的支持,但gcc V9.4.0版本不支持c++17)。因此本文介绍ubuntu20.4的系统下载最新gcc12.2版本源码,并进行本地编译、安装。本节内容包括gcc12.2的必备库安装和gcc12.2安装两部分内容组成。

q544344318的博客 1万+

Ubuntu22.04下ROS2与PX4仿真环境搭建全流程解析

本文详细解析了在Ubuntu22.04系统下搭建ROS2与PX4仿真环境的全流程,包括系统准备、ROS2 Humble安装、PX4飞控环境部署、ROS2与PX4通信桥梁搭建等关键步骤。针对常见问题提供了解决方案,并分享了性能优化和开发调试技巧,帮助开发者快速构建无人机仿真开发环境。

weixin_29248653的博客 607

python 多线程编程

多线程指的是同一进程下启动多个线程运行一个程序。有一个主线程 “main thread”,有两种方法可以创建线程: import threading thread = threading.Thread(target = None,name = None,args = (),kwargs = {}) target :线程需要运行的函数 name:线程名称 args :函数参数元组 kwa...

ouprince 329

手眼标定----眼在手上(eye-in-hand)

@TOC 标定之前你可以先拿个怡宝盖子进行测试。 第一步:打开halcon,采集,然后生成代码,显示十字架 第二步:把怡宝盖子放在十字架中心位置,在图像处理,找到怡宝盖子 第三步:找到怡宝盖子然后进行九点标定(眼在外帖子有讲),移动机器手然后分别拍9次照片,记录怡宝盖子坐标和当前机器坐标。这里移动到中心位置的时候记录一下单独记录一下坐标,等下要用。 顺序 第四步:拍完后利用vector_to_hom_mat2d算子求出矩阵,然后在利用write_tuple (HomMat2D, ‘路径’)进行保存。这里

苏州程序大白的博客 4282

qt线程结束通知

或其子类来定义你的任务,你可以在任务完成时发出一个自定义信号。然后,在你的主线程或任何感兴趣的线程中,你可以连接这个信号到一个槽函数,从而知道任务何时完成。),你可以在适当的时机(如任务完成后)发出一个自定义事件,并在主线程中处理这个事件。本身不提供直接的线程结束监听机制,但你可以通过结合 Qt 的信号和槽机制或其他方法来实现这一功能。主要负责管理线程的创建、调度和复用,而不是直接跟踪每个任务的完成状态。虽然这不是直接监听线程结束状态的方法,但你可以通过检查。)本身并不直接提供监听单个线程结束状态的机制。

weixin_42101997的博客 707

ABAP GIT 作用介绍

总结起来,ABAPGit 是一个强大的工具,它通过将 SAP ABAP 项目与 Git 版本控制系统集成,大大提高了代码管理的效率和团队协作的质量。在 ABAPGit 出现之前,ABAP 代码的版本控制和团队之间的协作主要依赖于手工操作或者是 SAP 自带的版本控制工具,这些方式效率低下,且难以实现高效的代码管理。使用 ABAPGit,SAP 项目团队不仅可以提高代码管理的效率和质量,还可以通过 Git 的强大功能实现高效的团队协作和代码审查。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 839

国科大学习资料--数据挖掘(刘莹)--第三章习题及参考答案

国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 第 3 章分类与回归 3.1简述决策树分类的主要步骤。 答:决策树生成的过程如下: (1)对数据源进行数据预处理, 得到训练集和测试集; (2)对训练集进行训练; (3)对初始决策树进行树剪枝; (4)由所得到的决策树提取分类规则; (5)使用测试数据集进行预测,评估决策树模型; 3.2给定决策树,选项有:(1)将决策树转换成规则,然后对结果

无名何许人的博客 3093

Qt 线程中断(终止,退出)

前言 场景: 有的时候我们开线程做耗时的任务, 但很久了也没有完成, 我可能会有会暂停线程(或者中止) Worker = make_shared<WorkerRandom>() Thread.start(); Worker->moveToThread(&Thread); connect(this, &RandomNum::OperateRun, Worker.get(), &WorkerRandom::StatrRun); v

黑塞的博客 9158

部署与可视化系统:零基础到精通:LabVIEW 调用 YOLO 动态链接库(DLL)的保姆级视觉检测系统融合实战

LabVIEW与YOLO26深度集成:工业视觉检测新范式 本文揭示了LabVIEW与最新YOLO26模型深度集成的创新方案,通过C++封装ONNX Runtime为DLL,在LabVIEW中实现端到端视觉检测。核心突破点包括: 技术选型:对比YOLOv5/YOLOv8/YOLO26性能,YOLO26在CPU推理速度提升43%,支持NMS-Free端到端推理 部署架构:提供ONNX Runtime C++ API和TensorRT两种DLL封装路径,适配不同硬件环境 工程实现:详细展示从PyTorch模型导出

ZXSXJ的博客 283

Java之多线程创建

Java多线程归纳前言传统的线程创建继承Thread类实现Runnable接口两者的共同点两者差别JDK 1.5开始出现的线程创建 前言 进程是资源分配的最小单位,而线程是执行任务的最小的单位。进程里的线程可以共享该进程拥有的资源,而进程之间不可以,进程奔溃了,在保护模式下,不会影响其他进程,而线程一旦出问题了,该进程也要GG思密达。总而言之,创建一个线程比创建一个进程要省事得多儿,这也是当今为...

legendaryhaha的博客 3819

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java中创建多线程的4种方式

在 Java 编程中,多线程是一项非常重要的技术,它能够充分利用计算机的多核处理器资源,提高程序的执行效率和响应性。本文将详细介绍 Java 中创建多线程的四种方式,包括继承 Thread 类、实现 Runnable 接口、实现 Callable 接口以及使用线程池,并对每种方式的原理、代码示例和适用场景进行深入剖析。

天冬忘忧的博客 2634

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java中如何创建多线程

进程和线程的关系 进程是所有线程的集合,每一个线程是进程中的一条执行路径。 什么是进程,什么是线程 进程,每个正在系统上运行的程序都是一个进程。 线程,线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行,每个进程包含一到多个线程。 多线程的好处(类比同步跟异步的概念) ☞ 提高执行任务的效率 ☞线程(任务)之间互相不影响,如果其中一个线程挂掉,另一个照常运行 Jav...

C8WATER 2095

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java创建多线程的四种方式及其区别

java创建多线程有如下四种方式: 继承Thread类创建线程 实现Runnable接口创建线程 使用Callable和Future创建线程 使用线程池创建(使用java.util.concurrent.Executor接口) 下面分别介绍这四种创建多线程的方式 1. ----------------------继承Thread类创建线程------------------------...

baihualindesu的博客 1万+

java 多线程创建

java多线程创建有三种方法 1.继承 2.接口 3.匿名内部类 来说说两种主要的创建方法 一.继承 创建一个类继承Thread,用来开启一个线程 package textthread; public class thread extends Thread { public void run() { for (int j = 0; j < 30; j++) { System.ou...

weixin_44714808的博客 220

Java多线程创建方式全解

在Java编程中,多线程是一个重要的概念,它能让程序同时执行多个任务,提高程序的效率和响应能力。以下将详细介绍Java中创建多线程的四种方式。 创建并启动线程 在主程序中创建线程对象,并调用方法来启动线程。方法会自动调用线程对象的方法,使得线程开始执行。例如: (二)特点 这种方式简单直接,符合面向对象的编程思想。但是,由于Java是单继承的,如果一个类已经继承了其他类,就无法再继承类来创建线程。 创建并启动线程 首先创建实现了接口的类的对象,然后将这个对象作为参数传递给类的构造函数来创建线程对象,

qq_68076599的博客 735

【Java】详解多线程的概述及三种创建方法

详解单线程、多线程的定义和意义及对多线程的三种创建方法(1).继承Thread类.(2).实现Runnable接口.(3)实现Callable接口以及三种方法的对比分析

2301_80760873的博客 2628

java多线程 创建方式详解

线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(Lightweight Process),但轻量进程更多指内核线程(Kernel-Level Thread),而把用户线程(User-Level Thread)称为线程。线程是独立调度和分派的基本单位。

m0_65724855的博客 722

JAVA中创建多线程方法

JAVA中创建多线程主要有以下三种方式: 方式一:继承Thread类,重写run()方法 /** * 模拟龟兔赛跑 */ public class Rabbit extends Thread{ @Override public void run() { for(int i=0;i<100;++i) { System.out....

SEUER123的博客 691

java 如何创建100个线程_java创建多线程

Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程,有两种方法:◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法;◆实现Runnalbe接口,重载Runnalbe接口中的run()方法。为什么Java要提供两种方...

weixin_42380646的博客 1844

【Java多线程】:理解线程创建、特性及后台进程

本篇主要是了解进程与线程,能够说出两者区别,并且掌握 创建多线程的 3 种方式,能够正确使用 Thread 类、Runnable 接口、Callable 接口实现多线程,并且了解 3 种创建多线程方式的区别。其次还会熟悉后台线程的使用,能够理解后台线程用于做什么

island1314的博客 2544

Java多线程的四种创建方式

分享了Java多线程的四种创建方式

xieyichun_的博客 1183

java创建多线程的四种方式

java多线程的创建方式是面试经常会被问到的一个问题,因此在这里我对java创建多线程的四种方式做一个简单的归纳与总结,便于复习。 一、继承Thread类创建多线程 ① 创建一个继承于Thread类的子类。 ② 重写Thread类中的run()方法,在run()方法中实现线程需要完成的功能。 ③ 创建Thread类的子类的对象,并调用这个对象的start()方法,调用start()后会自动启动当前线程,并调用当前线程的run()方法。 ...

weixin_48016395的博客 4957
上一篇: 转发和重定向的区别
下一篇: 一种通用的二分法写法
皮皮蟹01
博客等级 码龄10年 29粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值