
上一节了解了多线程的概念. 本节主要介绍如何使用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个并发客户端来检索地址簿java多线程用哪些实现,并输出地址簿信息,记录检索的完整时间,代码如下:

程序使用for循环模拟1000个并发客户端以检索通讯簿. 在模拟的检索任务开始之前,将调用系统的currentTimeMillis方法以获取系统的当前时间. 在执行模拟的检索任务之后,获得任务执行完成后的时间,然后计算两次之间的差,该差就是检索任务的运行时间. 该程序的输出如下图所示:
单线程完成同学的搜索和输出结果
从上图可以看出,搜索结果按顺序输出,耗时46ms.
3. 使用多个线程来完成搜索同学的任务
(1)将searchPhoenBook方法转换为线程
以上代码中PhoneBookSearch类的searchPhoenBook方法完成了地址簿的检索和信息输出. 以下代码将该方法转换为线程,以便当多个用户检索地址簿时,程序将启动一个线程以针对每个用户的检索请求执行检索任务,从顺序执行变为并发执行. 转换代码如下:

代码定义了SearchPhone. 此类实现Runnable接口,并重写Runnable接口的run()方法. 用run方法完成地址簿的搜索和输出功能.
(2)转换PhoneBookSearch类的主要方法
在PhoneBookSearch类的main方法中,不再调用searchPhoenBook方法,而是实例化Thread对象,并将SearchPhone类的实例作为参数传递,然后传递Thread对象的start方法被称为启动线程. 代码如下:
程序的输出如下图所示:
使用多个线程来完成同学检索任务的输出
从输出结果来看,搜索结果未按顺序输出,整个搜索耗时152ms. 使用多线程技术来实现地址簿的并发检索不会提高检索效率,但是速度不如单线程. 主要原因是每次系统启动线程时,都会消耗一定数量的系统资源,从而导致运行效率降低. 在此示例程序中,多线程不能反映多线程的性能优势.
让我们更改场景. 如果将地址簿检索放到服务器端,则可以同时有1000个用户同时检索地址簿. 如果服务器端是单线程服务,则虽然可以同时访问1000个用户,但它必须在服务器端. 随机排队等待服务器响应. 如果一个用户的响应时间为1秒,依此类推,则最后一个用户的响应时间为1000秒. 如果是多线程服务java多线程用哪些实现,则每个用户的平均响应时间约为2到3秒,这显然可以满足大多数用户的响应需求. 在这种情况下,多线程显示了性能优势.
■知识提示
在正常情况下,让程序完成多个任务并仅使用一个线程来完成将比使用多个线程来花费更少的时间. 因为JVM必须在调度和管理每个线程上花费某些资源和时间. 那么,在什么情况下应该使用多线程?一种是需要相对较高的用户响应并允许用户同时访问的场景. 另一个是程序具有耗时的计算,整个系统将等待此操作. 为了提高程序的响应速度,耗时的计算是通过线程完成的.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-288984-1.html