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

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法