百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

如何使用Java中的多线程 java中实现多线程一般使用两种方法

yuyutoo 2024-10-12 01:03 6 浏览 0 评论



什么是线程?

线程是轻量级进程(process)。 任何进程(process)都可以在其中运行多个线程。

例如,在Web浏览器中,我们可以有一个线程将加载用户界面,而我们可以有另一个线程实际上将检索需要在用户界面中显示的所有数据。

什么是多线程

多线程使我们能够同时运行多个线程。

例如,在Web浏览器中,我们可以有一个处理用户界面的线程,同时,我们可以有另一个线程来获取要显示的数据。

因此,多线程改善了系统的响应能力。

什么是并发

线程上下文中的并发性使我们可以同时运行多个线程。

但是线程真的在同时运行吗?

单核系统

JVM提供的线程调度程序(Thread Scheduler)决定在任何给定时间运行哪个线程。 调度程序给每个线程一段非常小的时间运行。

因此,在任何给定时间,我们只有一个在处理器中实际运行的线程。 但是由于切换时间间隔非常小,我们感觉到多个线程正在同时运行。

多核系统

即使在多核系统中,也要使用线程调度程序。 但是,由于我们有多个内核,因此实际上我们可以在相同时间运行多个线程。

例如,如果我们有一个双核系统,那么我们可以有两个线程同时运行。 第一个线程将在第一个内核中运行,第二个线程将在第二个内核中运行。

为什么需要多线程?

多线程使我们能够改善系统的响应能力。

例如,在Web浏览器中,如果所有内容都在单个Thread中运行,则每当获取数据以进行显示时,系统将完全不响应。 如果需要10秒钟来获取数据,那么在那10秒钟内,我们将无法在网络浏览器中执行任何其他操作,例如打开新标签页,甚至关闭浏览器。

因此,在不同线程中同时运行程序的不同部分有助于提高系统的响应能力。

如何用Java编写多线程程序

我们可以使用以下方法在Java中创建线程

  • 继承Thread类
  • 实施Runnable接口
  • 实施Callable接口
  • 通过Executor框架与Runnable和Callable任务一起使用

我将在下期稳重中介绍Callables和Executor框架。 在本文中,我将主要集中于继承Thread类和实现Runnable接口。

继承Thread类

为了创建可以在Thread中运行的代码,我们创建一个类,然后继承Thread类。 任务代码需要放在run()函数中。 在下面的代码中,您可以看到Worker是扩展Thread Class的类,并且在run()函数内部完成了打印数字0至5的任务。


在上面的代码中,Thread.currentThread().getName()用于获取运行代码的当前线程的名称。

为了创建一个线程,我们只需要创建一个Worker类的实例。 然后,我们可以使用start()函数启动线程。

在上述代码中,我们从Worker类创建3个线程t1,t2和t3。

然后,我们使用start()方法启动线程。

下图是通过扩展Thread类创建线程的全部代码。


这是我们通过运行上面的代码获得的输出


可以看出,所有3个线程都已打印从0到5的数字。

从输出中可以清楚地看到3个线程没有按任何特定顺序运行。

实现Runnable接口

为了创建可以在线程中运行的代码,我们创建一个类,然后实现Runnable接口。 由这段代码完成的任务需要放在run()函数中。 在下面的代码中,您可以看到RunnableWorker是实现Runnable接口的类,并且打印数字0到4的任务是在run()函数中完成的。


为了创建线程,首先我们需要创建一个RunnableWorker对象,该对象实现Runnable接口。

然后,我们可以通过创建Thread类的对象并将RunnableWorker的对象作为参数传递来创建新线程。 如下面的代码所示。

上面的代码创建了一个Runnable对象r。 然后,它创建3个线程t1,t2和t3,并将r作为参数传递给3个线程。 然后使用start()函数启动所有3个线程。

下图为通过实现Runnable接口创建线程的完整代码


在运行上述代码时,我们将获得以下输出。 每次运行代码时,输出顺序都会改变。


与继承Thread类相比,实现Runnable接口是更好的选择,因为我们只能继承一个类,但是我们可以在java中实现多个接口。

Java 8中的Runnable接口

在Java 8中,由于Runnable接口只有一个方法run(),因此它成为FunctionalInterface(函数式接口)

以下代码显示了我们如何在Java 8中创建可运行实例,并且使用了Lambda。


在这里,无需创建类然后实现Runnable接口,我们可以直接使用lambda表达式创建Runnable实例,如下所示




在下一篇文章中,我将讨论线程的生命周期和在使用线程时的挑战。

谢谢阅读。

? @adityasridhar

相关推荐

自卑的人容易患抑郁症吗?(自卑会导致抑郁吗)

Filephoto[Photo/IC]Lowself-esteemmakesusfeelbadaboutourselves.Butdidyouknowthatovert...

中考典型同(近)义词组(同义词考题)

中考典型同(近)义词组...

WPF 消息传递简明教程(wpf messagebox.show)

...

BroadcastReceiver的原理和使用(broadcast-suppression)

一、使用中注意的几点1.动态注册、静态注册的优先级在AndroidManifest.xml中静态注册的receiver比在代码中用registerReceiver动态注册的优先级要低。发送方在send...

Arduino通过串口透传ESP 13板与java程序交互

ESP13---是一个无线板子,配置通过热点通信Arduino通过串口透传ESP13板与java程序交互...

zookeeper的Leader选举源码解析(zookeeper角色选举角色包括)

作者:京东物流梁吉超zookeeper是一个分布式服务框架,主要解决分布式应用中常见的多种数据问题,例如集群管理,状态同步等。为解决这些问题zookeeper需要Leader选举进行保障数据的强一致...

接待外国人英文口语(接待外国友人的英语口语对话)

接待外国人英文口语询问访客身份:  MayIhaveyourname,please?  请问您贵姓?  Whatcompanyareyoufrom?  您是哪个公司的?  Could...

一文深入理解AP架构Nacos注册原理

Nacos简介Nacos是一款阿里巴巴开源用于管理分布式微服务的中间件,能够帮助开发人员快速实现动态服务发现、服务配置、服务元数据及流量管理等。这篇文章主要剖析一下Nacos作为注册中心时其服务注册与...

Android面试宝典之终极大招(android面试及答案)

以下内容来自兆隆IT云学院就业部,根据多年成功就业服务经验,以及职业素养课程部分内容,归纳总结:18.请描述一下Intent和IntentFilter。Android中通过Intent...

除了Crontab,Swoole Timer也可以实现定时任务的

一般的定时器是怎么实现的呢?我总结如下:1.使用Crontab工具,写一个shell脚本,在脚本中调用PHP文件,然后定期执行该脚本;2.ignore_user_abort()和set_time_li...

Spark源码阅读:DataFrame.collect 作业提交流程思维导图

本文分为两个部分:作业提交流程思维导图关键函数列表作业提交流程思维导图...

使用Xamarin和Visual Studio开发Android可穿戴设备应用

搭建开发环境我们需要做的第一件事情是安装必要的工具。因此,你需要首先安装VisualStudio。如果您使用的是VisualStudio2010,2012或2013,那么请确保它是一个专业版本或...

Android开发者必知的5个开源库(android 开发相关源码精编解析)

过去的时间里,Android开发逐步走向成熟,一个个与Android相关的开发工具也层出不穷。不过,在面对各种新鲜事物时,不要忘了那些我们每天使用的大量开源库。在这里,向大家介绍的就是,在这个任劳任怨...

Android事件总线还能怎么玩?(android实现事件处理的步骤)

顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity、Fragment、Service等组件之间的交互,很大程度上降低了它们之间的耦合,使我们的代码...

Android 开发中文引导-应用小部件

应用小部件是可以嵌入其它应用(例如主屏幕)并收到定期更新的微型应用视图。这些视图在用户界面中被叫做小部件,并可以用应用小部件提供者发布。可以容纳其他应用部件的应用组件叫做应用部件的宿主(1)。下面的截...

取消回复欢迎 发表评论: