JAVA多线程解惑之实现方式有几种

2024-04-14 03:32

本文主要是介绍JAVA多线程解惑之实现方式有几种,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

记得刚毕业的时候笔试或者面试通常会出现这样的问题“JAVA多线程有几种实现方式”,于是果断写下有两种,继承Thread抽象类或者实现Runnable接口。

 

但是当我们真正的观察Thread类的时候发现其实Thread也继承Runnable接口

public class Thread implements Runnable{
......

Runnable 接口更加简单,留下一个抽象方法之后就不负责任了。

public interface Runnable
{public abstract void run();
}

考虑到上面问题,那我们可以不可以直接说,实现多线程的方式只有一种,那就是实现Runnable接口呢。

这个问题没有答案,因为从继承和实现的角度来说是对的,但是,如果只实现一个Runnable接口就是一个多线程了那么多线真的太简单了。

还记得实现Runnable之后还要做什么吗?需要把这个对象作为参数放入Thread类中,然后调用start方法。

new Thread(new MyRunnable()).start();

 所以说没有Thread类,就算你实现了Runnable()接口之后这个类也不过是个普通的类而已。

 

我们仔细看Thread类发现,多线程的逻辑都在这个类中,当然里面还有很多内部类和本地方法(JNI)。

因为里面关键的代码都是JNI的所以我们无法从源代码中知道更多的信息。

重要点的方法有两个,一个是构造方法中调用的初始化方法

  private void init(ThreadGroup threadgroup, Runnable runnable, String s, long l){if(s == null)throw new NullPointerException("name cannot be null");Thread thread = currentThread();SecurityManager securitymanager = System.getSecurityManager();if(threadgroup == null){if(securitymanager != null)threadgroup = securitymanager.getThreadGroup();if(threadgroup == null)threadgroup = thread.getThreadGroup();}threadgroup.checkAccess();if(securitymanager != null && isCCLOverridden(getClass()))securitymanager.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);threadgroup.addUnstarted();group = threadgroup;daemon = thread.isDaemon();priority = thread.getPriority();name = s.toCharArray();if(securitymanager == null || isCCLOverridden(thread.getClass()))contextClassLoader = thread.getContextClassLoader();elsecontextClassLoader = thread.contextClassLoader;inheritedAccessControlContext = AccessController.getContext();target = runnable;setPriority(priority);if(thread.inheritableThreadLocals != null)inheritableThreadLocals = ThreadLocal.createInheritedMap(thread.inheritableThreadLocals);stackSize = l;tid = nextThreadID();}

 另外一个是调用start()的时候

 public synchronized void start(){boolean flag;if(threadStatus != 0)throw new IllegalThreadStateException();group.add(this);flag = false;start0();flag = true;try{if(!flag)group.threadStartFailed(this);}catch(Throwable throwable) { }break MISSING_BLOCK_LABEL_70;Exception exception;exception;try{if(!flag)group.threadStartFailed(this);}catch(Throwable throwable1) { }throw exception;}private native void start0();

 

 

这篇关于JAVA多线程解惑之实现方式有几种的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/901974

相关文章

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St