搜故事,从300万个故事到海量知识百科的华丽转变!

跟我学Java编程—用实例说明多线程的使用场景及方法

时间:2010-11-21

本节主要介绍如何使用Thread类来创建和启动线程

提示:本文共有 1971 个字,阅读大概需要 4 分钟。

前面一节了解了多线程的概念。本节主要介绍如何使用Thread类来创建和启动线程。

在讲解之前,先考虑一个编程任务。假设有一个同学通讯录,通讯录长度为1000,用于记录同学的姓名、电话、地址信息,用户可以并发检索该通讯录,输入通讯录中的姓名,程序从通讯录中查找该姓名,如果存在则输出与该姓名相关的电话、地址信息。任务要求简单模拟1000个用户的并发访问,检索功能分别采用单线程和多线程实现,比较在1000个用户的并发访问下,单线程和多线程的检索效率。

1、线程的创建和启动

Java提供了两种创建线程的方式。

一种方式是定义实现Java.lang.Runnable接口的类。Runnable接口中只有一个run()方法,用来定义线程运行体。代码如下:

定义好MyRunner类后,需要把MyRunner类的实例作为参数传入到Thread的构造方法中,来创建一个新线程。代码如下:

在ThreadRunDemo类的main方法中,实例化Thread对象,并将MyRunner类的实例作为参数传入进去,然后调用Thread对象的start方法启动线程。线程输出结果如下图所示:

MyRunner线程输出结果

另外一种方式是将类定义为Thread类的子类,并重写Thread类的run()方法,代码如下:

定义好Thread类的子类后,创建一个线程,只需要创建Thread子类的一个实例即可。代码如下:

在ThreadDemo2类的main方法中,只需实例化Thread对象即可,然后调用Thread对象的start方法启动线程。

注意:在两种创建线程的方式中,建议使用第一种方式。因为采用实现接口的方式可以避免由于Java的单一继承带来的局限,有利于代码的健壮性。

2、用单线程完成同学通讯录检索任务

(1)首先建立一个同学通讯录类,代码如下:

(2)初始化通讯录数据,用ArrayList集合类存储1000个PhoneBook对象,代码如下:

(3)用for循环模拟1000个并发客户检索通讯录,并输出通讯录信息,记录检索全部完成时间,代码如下:

程序用for循环模拟1000个并发客户检索通讯录,在模拟检索任务开始之前调用System的currentTimeMillis方法获取系统当前时间,模拟检索任务执行结束后,再获取任务执行完成后的时间,然后计算两个时间的差值,该差值就是检索任务运行的时间。程序输出结果如下图所示:

单线程完成同学通讯录检索任输出结果

从上图可以看出,检索结果按顺序输出,耗时46ms。

3、用多线程完成同学通讯录检索任务

(1)改造searchPhoenBook方法为线程

上面代码PhoneBookSearch 类searchPhoenBook方法完成通讯录的检索及信息输出。下面的代码把该方法改造为线程,这样就可以实现当多用户检索通讯录时,程序针对每个用户的检索请求,都会启动一个线程去执行检索任务,由顺序执行改为并发执行。改造代码如下:

代码定义一个SearchPhone,该类实现Runnable接口,并重写Runnable接口的run()方法,在run方法中,完成通讯录的检索及输出功能。

(2)改造PhoneBookSearch类的main方法

在PhoneBookSearch类的main方法中,不再调用searchPhoenBook方法,而是实例化Thread对象,并将SearchPhone类的实例作为参数传入进去,然后调用Thread对象的start方法启动线程,代码如下:

程序输出结果如下图所示:

用多线程完成同学通讯录检索任务输出结

从输出结果看,检索结果并没有按照顺序输出,整个检索耗时152ms。用多线程技术实现通讯录的并发检索,并没有提高检索效率,反而不如单线程的运行速度快。主要原因是系统每启动一个线程,都要耗费一定的系统资源,导致运行效率降低,多线程在这个例子程序中,并没有体现出多线程的性能优势。

我们换个场景,假如把通讯录的检索放到服务器端,1000个用户在同一时间并发检索通讯录,如果服务端是单线程服务,虽然1000个用户是并发访问,但要在服务器端随机排队等候服务器响应,如果1个用户的响应时间为1秒,那么依次类推,最后1个用户的响应时间为1000秒。如果是多线程服务,平均每个用户的响应时间为2到3秒左右,显然能够满足大多数用户的响应需求。在这个场景下,多线程就体现出了性能优势。

■ 知识点拨

在正常情况下,让程序来完成多个任务,只使用单个线程来完成比用多个线程完成所用的时间会更短。因为JVM在调度管理每个线程上肯定要花费一定资源和时间的。那么,在什么场景下使用多线程呢?一是对用户响应要求比较高,又允许用户并发访问的场景;二是程序存在耗费时间的计算,整个系统都会等待这个操作,为了提高程序的响应,将耗费时间的计算通过线程来完成。

看到此处说明本文对你还是有帮助的,关于“跟我学Java编程—用实例说明多线程的使用场景及方法”留言是大家的经验之谈相信也会对你有益,推荐继续阅读下面的相关内容,与本文相关度极高!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
Java多态性详细举例说明很经典例子

Java多态性详细举例说明很经典例子

方法,类型,定义,参数,对象,引用变量,多态,中的定义,如果在,用的是,被子,运行时,一个对象,方法是,个数,机制,优先级,名称,字体,实例,屏蔽,成员,结果,蓝色,问题,那句话,三优先,使用这个,到这里,可以改变

2020-08-15 #故事大全

黑马程序员:Java学科

黑马程序员:Java学科

接口,时候,方法,引用类型,定义,类型,成员变量,参数,返回值,技能,角色,类对象,代码,测试,什么呢,基本类型,游戏角色,内容,信息,偶数,基础,姓名,常量,属性,对方,定义方法,对象,文章,扩展性,方式

2013-03-08 #长篇故事

Java

Java

能力,设计,互联网,产品,学历,基础,基础知识,数据库,方法,本科,经验,高质量,责任心,公司,工作,服务,全面深刻,系统架构,公司相关,有效地,平稳运行,具有较强,大型系统,或以上,开源框架,确保线,沟通协调,系统开发,系统设计,问题定...

2020-07-12 #故事阅读

JAVA语言中的经典案例:猜字母游戏

JAVA语言中的经典案例:猜字母游戏

字母,玩家,数组,字符,方法,个数,结果,位置,步骤,字符串,类型,存储,循环,变量,游戏,随机生成,游戏结束,程序,得分,定义方法,字母游戏,嵌套循环,大写字母,定义,提示信息,方案,可以看出,进行比较,义一,结构

2009-08-16 #故事大全

实例讲解丨如何编写岗位说明书

实例讲解丨如何编写岗位说明书

职位,职责,工作,公司,人力资源部,岗位,人力资源,岗位说明书,上级,员工,概要,各部门,权限,组织,任职资格,工作职责,绩效考核,知识,资格证书,部门,培训,绩效指标,依据,名称,绩效,所属部门,素质要求,职位名称,下级,人员

2020-07-03 #故事阅读

java任务调度之Timer定时器(案例和源码分析)

java任务调度之Timer定时器(案例和源码分析)

任务,方法,源码,分析,缺陷,定时任务,执行时间,时间,时候,线程,构造方法,很简单,意思是,定时器,代码,参数,队列,为我们,下一次,上一次,创建一个,执行任务,时间之后,看一下,最核心,位置,例子,原理,名字,实际

2017-07-05 #长篇故事

阿里大牛 用数百案例带你深入Java语言和库 掌握Java的核心技术

阿里大牛 用数百案例带你深入Java语言和库 掌握Java的核心技术

代码,程序,时间,图形,日期,文本,注解,主题,核心技术,技术,数据,程序员,目录,脚本,语言,内容,二进制,信息,处理器,工具,工具包,应用程序,数字,文件,数据库,方法,朋友,服务器,构件,私信

2019-07-09 #故事会在线阅读

唇亡齿寒的实例请你用一个故事或生活中的实例来说明“唇亡齿寒”的道理我要的是实例

唇亡齿寒的实例请你用一个故事或生活中的实例来说明“唇亡齿寒”的道理我要的是实例

虞国,虢国,晋献公,荀息,晋国,借道,虞公,唇亡齿寒,实例,美玉,宫之奇,嘴唇,大夫,宝马,牙齿,近邻,唇齿相依,虞虢,典故,一家老小,人家,人们,借条,关系,春秋,时候,实力,地盘,军队,出处

2011-04-20 #故事会在线阅读