教育路上

全国站>Java>多线程>java两种实现多线程方式的对比分析Thread和Runable
学员需求

java两种实现多线程方式的对比分析Thread和Runable

摘要:java两种实现多线程方式的对比分析Thread和Runable,java 多线程对比 Thread Runable ,接继承 Thread 类和实现 Runable 接口都能实现多线程,那么这两种实现多线程的方式在实际应用中又有什么区别呢?。以下是我们为大家整理的,相信大家阅读完后肯定有了自己的选择吧。

2022-05-19 13:36网络推荐

发布时间:
2022-05-19 13:36
信息来源:
网络推荐
浏览次数:
680
java两种实现多线程方式的对比分析Thread和Runable

既然直接继承 Thread 类和实现 Runable 接口都能实现多线程,那么这两种实现

多线程的方式在实际应用中又有什么区别呢?接下来通过一种应用场景来分析。

假设售票厅有四个窗口可发售某日某次列车的 100 张车票,这时,100 张车票可以看作

共享资源,四个售票窗口需要创建四个线程。为了更直观显示窗口的售票情况,可以通过

Thread 的 currentThread()方法得到当前的线程的实例对象,然后调用 getName()可以获取到

线程的名称。接下来,首先通过继承 Thread 类的方式来实现多线程的创建,如例 14-4 所示。

例 14-3 Example04.java

public class Example04 {

public static void main(String[] args) {

new TicketWindow().start(); // 创建一个线程对象 TicketWindow 并开启

new TicketWindow().start(); // 创建一个线程对象 TicketWindow 并开启

new TicketWindow().start(); // 创建一个线程对象 TicketWindow 并开启

new TicketWindow().start(); // 创建一个线程对象 TicketWindow 并开启

}

}

class TicketWindow extends Thread {

private int tickets = 100;

public void run() {

while (true) { // 通过死循环语句打印语句

if (tickets > 0) {

Thread th = Thread.currentThread(); // 获取当前线程

String th_name = th.getName(); // 获取当前线程的名字

System.out.println(th_name + " 正在发售第 " + tickets--+" 张票 ");

}

}

}

}

运行结果如图 14-7 所示

from shengerguan

从图 14-7 所示的运行结果可以看出,每张票都被打印了四次。出现这种现象的原因是四个

线程没有共享 100 张票,而是各自出售了 100 张票。在程序中创建了四个 TicketWindow 对

象,就等于创建了四个售票程序,每个程序中都有 100 张票,每个线程在独立地处理各自的

资源。需要注意的是,例 14-4 中每个线程都有自己的名字,主线程默认的名字是“main”,

用户创建的第一个线程默认的名字为“Thread-0”,第二个线程的默认名字为“Thread-1”,

以此类推。如果希望指定线程的名称,则可以通过调用 setName(String name)为线程设置名

称。

由于现实中的铁路系统中的票资源是共享的,因此上面的运行结果显然不合理。为了保

证资源共享,在程序中只能创建一个售票对象,然后开启多个线程去运行同一个售票对象的

售票方法,简单来说就是四个线程运行同一个售票程序,这时就需要用到多线程的第二种实

现方式。将例 14-4 进行修改,并使用构造方法 Thread(Runnable target, String name)在创建线

程对象的同时制定线程的名称,如例 14-5 所示

例 14-3 Example05.java

public class Example05 {

public static void main(String[] args) {

TicketWindow tw = new TicketWindow(); // 创建 TicketWindow 实例对象 tw

new Thread(tw, "窗口 1").start(); // 创建线程对象并命名为窗口 1,开启

线程

new Thread(tw, "窗口 2").start(); // 创建线程对象并命名为窗口 2,开启

线程

new Thread(tw, "窗口 3").start(); // 创建线程对象并命名为窗口 3,开启

线程

new Thread(tw, "窗口 4").start(); // 创建线程对象并命名为窗口 4,开启

线程

}

}

class TicketWindow implements Runnable {

private int tickets = 100;

public void run() {

while (true) {

if (tickets > 0) {

Thread th = Thread.currentThread(); // 获取当前线程

String th_name = th.getName(); // 获取当前线程的名字

System.out.println(th_name + " 正在发售第 " + tickets-- + " 张票 ");

}

}

}

}

运行结果如图 14-8 所示


from shengerguan

例 14-5 中只创建了一个 TicketWindow 对象,然后创建了四个线程,在每个线程上都去 调用这个 TicketWindow 对象中的 run()方法,这样就可以确保四个线程访问的是同一个 ticket 变量,共享 100 张车票。 通过上面的两个例程可以看出,实现 Runnable 接口相对于继承 Thread 类来说,有如下 显著的好处:  适合多个相同程序代码的线程去处理同一个资源的情况,把线程同线程代码、 数据有效的分离,很好地体现了面向对象的设计思想。  可以避免由于 Java 的单继承带来的局限性。在开发中经常碰到这样一种情况, 就是使用一个已经继承了某一个类的子类创建线程,由于一个类不能同时有两 个父类,所以不能用继承 Thread 类的方式,那么就只能采用实现 Runnable 接 口的方式。 事实上,大部分的应用程序都会采用第二种方式来创建多线程,即实现 Runnable 接口。

上一篇:
java实现 Runnable 接口创建多线程
下一篇:
java后台线程多线程
标签:
网友评论
发布评论

访客的评论 2024/04/27 09:52

文中描述的是准确的吗,如何报名!

相关推荐
我也来发表评价关闭
我对该内容的评价:
0
评价500
验证码: 看不清 换一张
提交 (匿名发布,无须担心别人知道您的身份)
学校免费发布信息关闭
我们审核后会尽快展示,如有图片请发邮件到:edu63@foxmail.com

姓      名:

内      容:

手机号码:

验  证  码:  换一张

确认提交
填写需求信息关闭
我们会根据您的需求匹配并审核留言

姓      名:

意向城市:

留      言:

手机号码:

验  证  码:  换一张

确认提交
完善补充本文信息关闭
非常感谢您帮助完善补充本文信息


 换一张

确认提交