Java 创建线程的两个方法

Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程,有两种方法:
◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法;
◆实现Runnalbe接口,重载Runnalbe接口中的run()方法。
为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢?
在Java中,类仅支持单继承,也就是说,当定义一个新的类的时候,它只能扩展一个外部类.这样,如果创建自定义线程类的时候是通过扩展 Thread类的方法来实现的,那么这个自定义类就不能再去扩展其他的类,也就无法实现更加复杂的功能。因此,如果自定义类必须扩展其他的类,那么就可以使用实现Runnable接口的方法来定义该类为线程类,这样就可以避免Java单继承所带来的局限性。
还有一点最重要的就是使用实现Runnable接口的方式创建的线程可以处理同一资源,从而实现资源的共享.
(1)通过扩展Thread类来创建多线程
假设一个影院有三个售票口,分别用于向儿童、|成人|和老人售票。影院为每个窗口放有100张电影票,分别是儿童票、|成人|票和老人票。三个窗口需要同时卖票,而现在只有一个售票员,这个售票员就相当于一个CPU,三个窗口就相当于三个线程。通过程序来看一看是如何创建这三个线程的。
public class MutliThreadDemo {
public static void main(String [] args){
MutliThread m1=new MutliThread("Window 1");
MutliThread m2=new MutliThread("Window 2");
MutliThread m3=new MutliThread("Window 3");
m1.start();
m2.start();
m3.start();
}
}
class MutliThread extends Thread{
private int ticket=100;//每个线程都拥有100张票
MutliThread(String name){
super(name);//调用父类带参数的构造方法
}
public void run(){
while(ticket>0){
System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
}
}
}
程序中定义一个线程类,它扩展了Thread类。利用扩展的线程类在MutliThreadDemo类的主方法中创建了三个线程对象,并通过start()方法分别将它们启动。
从结果可以看到,每个线程分别对应100张电影票,之间并无任何关系,这就说明每个线程之间是平等的,没有优先级关系,因此都有机会得到CPU的处理。但是结果显示这三个线程并不是依次交替执行,而是在三个线程同时被执行的情况下,有的线程被分配时间片的机会多,票被提前卖完,而有的线程被分配时间片的机会比较少,票迟一些卖完。
可见,利用扩展Thread类创建的多个线程,虽然执行的是相同的代码,但彼此相互独立,且各自拥有自己的资源,互不干扰。
(2)通过实现Runnable接口来创建多线程
public class MutliThreadDemo2 {
public static void main(String [] args){
MutliThread m1=new MutliThread("Window 1");
MutliThread m2=new MutliThread("Window 2");
MutliThread m3=new MutliThread("Window 3");
Thread t1=new Thread(m1);
Thread t2=new Thread(m2);
Thread t3=new Thread(m3);
t1.start();
t2.start();
t3.start();
}
}
class MutliThread implements Runnable{
private int ticket=100;//每个线程都拥有100张票
private String name;
MutliThread(String name){
this.name=name;
}
public void run(){
while(ticket>0){
System.out.println(ticket--+" is saled by "+name);
}
}
}
由于这三个线程也是彼此独立,各自拥有自己的资源,即100张电影票,因此程序输出的结果和(1)结果大同小异。均是各自线程对自己的100张票进行单独的处理,互不影响。
可见,只要现实的情况要求保证新建线程彼此相互独立,各自拥有资源,且互不干扰,采用哪个方式来创建多线程都是可以的。因为这两种方式创建的多线程程序能够实现相同的功能。
由于这三个线程也是彼此独立,各自拥有自己的资源,即100张电影票,因此程序输出的结果和例4.2.1的结果大同小异。均是各自线程对自己的100张票进行单独的处理,互不影响。
可见,只要现实的情况要求保证新建线程彼此相互独立,各自拥有资源,且互不干扰,采用哪个方式来创建多线程都是可以的。因为这两种方式创建的多线程程序能够实现相同的功能。
(3)通过实现Runnable接口来实现线程间的资源共享
现实中也存在这样的情况,比如模拟一个火车站的售票系统,假如当日从A地发往B地的火车票只有100张,且允许所有窗口卖这100张票,那么每一个窗口也相当于一个线程,但是这时和前面的例子不同之处就在于所有线程处理的资源是同一个资源,即100张车票。如果还用前面的方式来创建线程显然是无法实现的,这种情况该怎样处理呢?看下面这个程序,程序代码如下所示:
public class MutliThreadDemo3 {
public static void main(String [] args){
MutliThread m=new MutliThread();
Thread t1=new Thread(m,"Window 1");
Thread t2=new Thread(m,"Window 2");
Thread t3=new Thread(m,"Window 3");
t1.start();
t2.start();
t3.start();
}
}
class MutliThread implements Runnable{
private int ticket=100;//每个线程都拥有100张票
public void run(){
while(ticket>0){
System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
}
}
}
结果正如前面分析的那样,程序在内存中仅创建了一个资源,而新建的三个线程都是基于访问这同一资源的,并且由于每个线程上所运行的是相同的代码,因此它们执行的功能也是相同的。
可见,如果现实问题中要求必须创建多个线程来执行同一任务,而且这多个线程之间还将共享同一个资源,那么就可以使用实现Runnable接口的方式来创建多线程程序。而这一功能通过扩展Thread类是无法实现的,读者想想看,为什么?
实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,从而特别适合多个具有相同代码的线程去处理同一资源的情况。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Java
# 创建线程的两个方法
# 线程创建
# 创建线程的方法对比
# Java 创建两个线程模拟对话并交替输出实现解析
# 了解Java线程池创建过程
# Java多线程——之一创建线程的四种方法
# Java多线程中线程的两种创建方式及比较代码示例
# 创建并运行一个java线程方法介绍
# java 创建线程的几种方式
# Java 线程池详解及创建简单实例
# Java创建线程的两种方式
# 简单了解Java创建线程两种方法
# 多线程
# 多个
# 都是
# 自己的
# 这三个
# 自定义
# 的是
# 其他的
# 大同小异
# 这两种
# 来实现
# 方法来
# 就可以
# 卖完
# 这一
# 对自己的
# 是在
# 都有
# 很好
# 也就
相关文章:
,南京靠谱的征婚网站?
如何确认建站备案号应放置的具体位置?
北京企业网站设计制作公司,北京铁路集团官方网站?
自助网站制作软件,个人如何自助建网站?
如何在Golang中使用replace替换模块_指定本地或远程路径
相册网站制作软件,图片上的网址怎么复制?
表情包在线制作网站免费,表情包怎么弄?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
详解jQuery停止动画——stop()方法的使用
C#怎么创建控制台应用 C# Console App项目创建方法
建站主机空间推荐 高性价比配置与快速部署方案解析
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
建站VPS推荐:2025年高性能服务器配置指南
如何选择最佳自助建站系统?快速指南解析优劣
网站网页制作专业公司,怎样制作自己的网页?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
浅谈Javascript中的Label语句
如何在阿里云部署织梦网站?
c++怎么用jemalloc c++替换默认内存分配器【性能】
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何通过VPS建站无需域名直接访问?
建站之星与建站宝盒如何选择最佳方案?
如何通过WDCP绑定主域名及创建子域名站点?
网站制作需要会哪些技术,建立一个网站要花费多少?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
音响网站制作视频教程,隆霸音响官方网站?
如何用景安虚拟主机手机版绑定域名建站?
建站之星如何一键生成手机站?
如何选择适配移动端的WAP自助建站平台?
ppt制作免费网站有哪些,ppt模板免费下载网站?
jQuery 常见小例汇总
微信小程序制作网站有哪些,微信小程序需要做网站吗?
网站app免费制作软件,能免费看各大网站视频的手机app?
如何在建站之星网店版论坛获取技术支持?
如何选择高效稳定的ISP建站解决方案?
已有域名如何快速搭建专属网站?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
如何通过远程VPS快速搭建个人网站?
建站VPS配置与SEO优化指南:关键词排名提升策略
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
学校为何禁止电信移动建设网站?
建站主机选择指南:服务器配置与SEO优化实战技巧
如何获取免费开源的自助建站系统源码?
C++中引用和指针有什么区别?(代码说明)
沈阳制作网站公司排名,沈阳装饰协会官方网站?
建站之星CMS五站合一模板配置与SEO优化指南
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何在万网自助建站平台快速创建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。