多线程实现四种方式以及源码分析

【Android+多线程】异步 多线程 知识总结:基础概念 / 多种方式 / 实现方法 / 源码分析 一个基本的CPU执行单元 & 程序执行流的最小单元。 阅读详情

实现 Java 多线程的方式有四种:

  1. 继承Thread类,重写run方法
  2. 实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的参数
  3. 通过Callable和FutureTask创建线程
  4. 通过线程池创建线程

第一种:继承 Thread 类,重写 run 方法

package com.example.thread;

public class ThreadTest {
	public static void main(String[] args) {
		
		Thread myThread1=new MyThread();
		Thread myThread2=new MyThread();
		myThread1.start();
		myThread2.start();
	}

}
/**
 * 线程类
 */
class MyThread extends Thread{
	
	private int i=0;
	
	public void run() {
		for(i=0;i<100;i++){
			System.out.println(Thread.currentThread().getName()+" : "+i);
		}
	}
}

第二种:实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的参数

package com.example.thread;

public class ThreadTest02 {

	public static void main(String[] args) {
		Runnable myRunnable1=new MyRunnable();
		Runnable myRunnable2=new MyRunnable();
		
		Thread thread1=new Thread(myRunnable1);
		Thread thread2=new Thread(myRunnable2);
		
		thread1.start();
		thread2.start();
	}
}
/**
 * 实现 Runnable 接口
 */
class MyRunnable implements Runnable{
	
	private int i=0;
	
	public void run() {
		for(i=0;i<100;i++){
			System.out.println(Thread.currentThread().getName() + " : " + i);
		}
	}
}

第三种:通过Callable和FutureTask创建线程

package com.example.thread;

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

public class ThreadTest03 {
	public static void main(String[] args) {
		Callable<Integer> myCallable=new MyCallable();
		FutureTask<Integer> ft=new FutureTask<Integer>(myCallable);
		
		Thread thread=new Thread(ft);
		thread.start();
		
		try {
			int sum=ft.get();
			System.out.println("sum "+" : "+sum);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
		
	}

}
/*
 * 实现了 Callable 接口
 */
class MyCallable implements Callable<Integer>{

	private int i=0;
	
	public Integer call() throws Exception {
		int sum = 0;
		for (; i <= 100; i++) {
			System.out.println(Thread.currentThread().getName() + " " + i);
			sum += i;
		}
		return sum;
	}
}

第四种:通过线程池创建线程

package com.example.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadTest04 {

	public static void main(String[] args) {
		
		ExecutorService executorService=Executors.newFixedThreadPool(2);
		
		Runnable runnable=new Runnable(){
			public void run() {
				System.out.println(Thread.currentThread().getName());
			}
		};
		executorService.submit(runnable);
		executorService.shutdown();
	}
}

分析:四种方法,底层都是实现了 Runnable 接口。

第一种:Thread 类继承了 Runnable 接口,源码如下:

第二种:Runnable 接口实现对象作为参数传入 Thread 构造函数中,Thread 构造函数方法如下:

进入 init() 方法, 发现传入的 target 赋给了 Thread 对象的成员变量 target

Thread 类继承了 Runnable 接口,重写 Runnbale 接口的 Runnable 接口的 run() 方法,而此 run() 方法执行的是 传入的 target 的 run() 方法


第三种: 通过Callable和FutureTask创建线程

源码分析:FutureTask实现了 RunnableFuture 接口,而 RunnableFuture 接口继承了 Runnable 接口。

Callable 接口的实现类的实例化对象作为参数传入到 FutureTask 的构造函数,构造函数中将其赋给成员变量 callbale 

FutureTask 继承了 Runnable 接口,重写 run() 方法,run() 方法执行的是传入的 Callable 接口的实现类的实例化对象的 call() 方法:

注:之后的源码分析与第二种多线程实现源码分析一致,将 Runnable 接口的实现类的实例化对象传入 Thread 的构造方法。

第四种: 通过线程池创建线程,传入的是 Runnable 接口,最后执行的也是 Runnbale 接口中的 run()方法。

《Java多线程设计模式详解》(PDF及源码) 这本书是很经典的! 如何充分利用系统资源,如何让你的软件跑得更快?如何在多处理器下更好的实现多线程呢?该书详细阐述了JAVA多线程的设计、开发并配有测试源代码,更值得注意是将多线程设计与设计模式结合起来,供我们设计大型服务器的多线程提供了帮助。 立即下载

相关推荐

ndt_omp:多线程和SSE友好的NDT算法

ndt_omp 该软件包提供了从pcl派生的OpenMP增强的正态分布变换(和GICP)算法。 将NDT算法修改为对SSE友好并且是多线程的。 它的运行速度比pcl中的原始版本快10倍。 基准测试(在Core i7-6700K上) $ roscd ndt_omp/data $ rosrun ndt_omp align 251370668.pcd 251371071.pcd --- pcl::NDT --- single : 282.222[msec] 10times: 2921.92[msec] fitness: 0.213937 --- pclomp::NDT (KDTREE, 1 threads) --- single : 207.697[msec] 10times: 2059.19[msec] fitness: 0.213937 --- pclomp::NDT (DIRECT7,

多线程实现的四种方式

实现多线程有以下四种方式: 1. 继承Thread类 2.实现Runnable接口 3.实现Callable接口 4.线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度。 体系结构: java.util.concurrent.Executor : 负责线程的使用与调度的根接口          |--ExecutorService 子...

刘信坚的博客 5万+

电商秒杀场景下,如何用Redis+Lua脚本实现原子性库存扣减(附完整代码)

本文针对电商秒杀场景下的高并发与超卖难题,详细解析了如何利用Redis的原子性命令与Lua脚本实现可靠的库存扣减。通过对比多种方案,阐述了Redis+Lua作为黄金搭档的技术原理,并提供了从基础扣减到预扣减模型的完整代码实现,确保在高并发下数据的一致性与系统性能。

weixin_29219539的博客 502

多线程的几种实现方式

当队列中有元素后,被阻塞的线程会自动被唤醒,这极大的提高的编码的灵活性,非常方便。4.线程池ExecutorService和工具类Executors优点:可以根据实际情况创建线程数量,且只需要创建一个线程池即可,也能够通过Callable和Future接口得到线程的返回值,程序的执行时间与线程的数量紧密相关。2.继承Thread类的优点:简单,且只需要实现父类的run方法即可(start方法中含有run方法,会创建一个新的线程,而run是执行当前线程)。每当一个线程完成了自己的任务后,计数器的值就会减1。

欢迎来到我的博客 4276

使用Dify搭建音频文件转文本工作流

使用Dify搭建音频文件转文本工作流

zyx_bx的博客 5622

ZYNQ出现问题及解决办法汇总(一直更新)

问题目录使用软件及开发板版本一,vitis在build project时卡住。二,Could not find FPGA device on the board for connection 'Local'三,FPGA configuration failed:DONE PIN is not high四,Could not find ARM device on the board for connection 'Local' 使用软件及开发板版本 开发板:MZ7XA-7020 软件:vitis2020.2(

qq_45057368的博客 1万+

多线程的四种实现方式

多线程啊多线程。

qq_41548931的博客 3140

使用SAM进行遥感图像语义分割

SAM(Segment Anything Model)的成功表明了以数据为中心的机器学习的重要性。然而,由于遥感(RS)图像注释的困难和高成本,大量有价值的RS数据仍然没有被标记,特别是在像素级。在这项研究中,我们利用SAM和现有的RS物体检测数据集,开发了一个高效的管道来生成大规模的RS分割数据集,称为SAMRS。SAMRS在规模上超过了现有的高分辨率RS分割数据集几个数量级,并提供了物体类别、位置和实例信息,可用于语义分割、实例分割和物体检测,无论是单独还是组合。

lalula的博客 7451

java实现多线程的四种方式及多线程源码分析

写在前面 本文描述了java实现多线程的四种方式,文章可能还有很多不足,请大家谅解,欢迎大佬提意见。 本文使用到的东西 eclipse 2019-11 java 文章目录写在前面本文使用到的东西1.继承Thread类1.1实现代码1.2源码分析2.实现Runnable接口2.1实现代码2.2 源码分析3.实现Callable3.1实现代码3.2 Callable源码分析3.3 FutureTa...

玖涯博客 496

【软考高级架构】论文范文17——论软件系统架构评估及其应用(ATAM)

软件系统架构评估是保障系统质量属性满足业务目标的关键环节,架构权衡分析方法(Architecture Trade-off Analysis Method,ATAM)作为一种主流的架构评估方法,通过场景识别、敏感点与权衡点分析、风险与非风险决策识别等系统化活动,能够在架构设计早期发现潜在问题,降低后期修改成本。本文以笔者主导的某省级智慧医疗平台架构评估项目为案例,围绕ATAM方法的应用展开论述。笔者担任系统架构师,负责组织评估团队、引导场景捕获、分析架构决策、识别风险与权衡点。

qq837993702的博客 489

TMS320F28335调试跟踪的问题:DSP从上电复位,一直到执行main()的第一条语句之间,都干了些什么,以及CCS调试时程序查找的问题

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1209

Java创建多线程的四种方式

java有以下四种创建多线程的方式: 1):继承Thread类创建线程 2)实现Runnable接口创建线程 3)使用Callable和FutureTask创建线程 4)使用线程池,例如用Executor框架创建线程 1)继承Thread类创建线程步骤如下: 定义一个继承Thread线程类的类,在类中重写run方法。 在main函数中实例化这个类,初始化实现r继承Thread类的对象。...

Hollake的博客 814

银行监管报送系统介绍(十五):金融审计平台

金审平台主要包括基础、财务、结算、信贷和中间业务五大板块,主要服务于审计署对中国银行的各项审计任务,同时也可为行内审计、稽核检查、数据分析、总分行提供基础数据服务,为实现基础数据共享提供了有力的数据保障。2019年1月某全国性股份制商业银行收到审计署2019-23号文,文中指出为进一步提高审计数据质量,审计署审计组派员前往9家重点商业银行,就完善标准化数据的相关情况与各银行有关部门进行讨论协商。关于数据报送频率及报送内容:数据从2019年4月开始,按月报送,即于每月25日之前报送上月数据;

银行信息系统应用架构详解 2052

java实现多线程的方式并源码分析

方式一:继承Thread 定义一个MyThread类,重写run方法 public class MyThred extends Thread{ @Override public void run() { System.out.println("MyThread.run()"); } } Thread本身实现了Runnable接口 ...

小草的博客 474

光电二极管探测器电流信号处理与指令输出系统

本文提出了一种基于Python的光电二极管电流信号处理系统设计方案。该系统能够实时采集、处理光电二极管输出的电流信号,并根据预设阈值输出控制指令。系统采用模块化架构,包含数据采集、信号处理、阈值检测、指令生成等核心模块。其中数据采集模块提供了模拟器实现和硬件接口框架,支持噪声模拟和脉冲信号生成。系统设计考虑了实时性、可靠性和可扩展性,适用于光强测量、光电检测等多种应用场景。

huanghm88的专栏 1180

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

全面详解Android实现多线程的几种方式(史上最全,最详细)

全面详解Android实现多线程的几种方式(史上最全,最详细)

afufufufu的博客 7032

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android 多线程之 IntentService 源码分析

Android 多线程之 IntentService 源码分析 文章目录Android 多线程之 IntentService 源码分析一、前言二、初识` IntentService`2.1 API 文档定义2.1 使用时需要关注的方法 `onHandleIntent(Intent intent)`三、基本使用三、源码分析3.1 成员变量3.2流程解析3.3 为什么多次启动` IntentServi...

Sean_css的博客 1126

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Juc01_多线程概述、四种实现方式、常用方法API、生命周期、买票案例、synchronized锁

1.摩尔定律失效(硬件方面):(1) 集成电路上可以容纳的晶体管数目在大约每经过18个月便会增加一倍,可是从2003年开始CPU主频已经不再翻倍,而是采用多核而不是更快的主频(2). 在主频不再提高且核数不断增加的情况下,要想让程序更快就要用到并行或并发编程高并发系统,异步+回调的生产需求(软件方面)

qq_46265096的博客 978

多线程 | ThreadLocal源码分析

ThreadLocal 是一种特殊的无锁线程安全方式,通过为每个线程分配独立的资源副本,从根本上避免发生资源冲突;ThreadLocal 在所有线程间隔离,InheritableThreadLocal 在创建子线程时会拷贝父线程中 InheritableThreadLocal 的有效键值对;虽然 ThreadLocal 提供了自动清理数据的能力,但是自动清理存在滞后性。为了避免内存泄漏,在业务开发中应该及时调用 remove 清理无效的局部存储;

蘑菇蘑菇不会开花的专栏 1372

实现多线程的两种方式

一:多线程的实现 1)第一种实现方式继承(Thread) 定义类继承Thread 重写run方法 把新线程要做的事情写在run方法中 创建线程对象 开启线程,内部会自动执行run方法 public class Demo1_Thread { public static void main(String [] args){ MyThread mt = new

Strive_Peter的博客 596

Java 多线程(二)启动线程的三种方式和源码分析

文章目录继承 Thread实现源码分析实现 Runnable实现源码分析实现 Callable实现源码分析 继承 Thread 实现 class MyThread extends Thread{ @Override public void run() { System.out.println("我继承了Thread类"); } } public static void main(String[] args) { MyThread thread1 = new MyThread(); th

qq_27494201的博客 1024

java的多线程实现方式_Java多线程_创建多线程的两种常用方式浅析

Java实现多线程有两种常用方法:继承Thread类和实现Runable接口。下面学习下两种方法的源码。1.继承Thread类这种方法实现多线程示例如下:class MyThread extends Thread{@Overridepublic void run(){System.out.println("Hello thread");}}public class ThreadPool {publ...

weixin_28693683的博客 178

多线程的两种实现方式

多线程的两种实现方式 1、Thread 类 Java.lang 包下,不需要导包  将类继承 Thread ,重写Run() 方法,将要执行多线程的代码写在 Run(){ } 中 public class demon2 {   // start() 开启线程需要一点点时间。这个时间里面CPU就去执行主线程 输出bb 了,等线程开启好了就会随机切换我们写的...

app10011的博客 251

多线程的四种实现简单源码分析

继承Thread类 步骤1:实现run方法 public class myThread extends Thread { @Override public void run() { for (int i = 0; i < 10000; i++) { System.out.println("run=" + Thread.currentT...

m_ddNice的博客 217
上一篇: Redis 进阶(事务、生存时间、排序)
下一篇: oracle PACKAGE中的函数如何查看函数体(两种方法)
程序员楂楂
博客等级 码龄9年 17粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值