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

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2