问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Java如何模拟多线程

发布网友 发布时间:2022-05-16 02:27

我来回答

1个回答

热心网友 时间:2023-10-09 06:05

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张车票。如果还用前面的方式来创建线程显然是无法实现的,这种情况该怎样处理呢?看下面这个程序,程序代码如下所示:

+ View Code
结果正如前面分析的那样,程序在内存中仅创建了一个资源,而新建的三个线程都是基于访问这同一资源的,并且由于每个线程上所运行的是相同的代码,因此它们执行的功能也是相同的。
可见,如果现实问题中要求必须创建多个线程来执行同一任务,而且这多个线程之间还将共享同一个资源,那么就可以使用实现Runnable接口的方式来创建多线程程序。而这一功能通过扩展Thread类是无法实现的,读者想想看,为什么?
实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,从而特别适合多个具有相同代码的线程去处理同一资源的情况。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
工会主席权限 魅族坏了怎么办 网上买的魅族手机坏了可以保修吗?自己弄坏的,手机花屏,修要多少钱... 从梁溪路公益路公交站到建筑路夏联福记酒店坐什么公交最方便? 退货保和运费险有什么不同 现代Logo设计趋势是什么 优秀的logo设计有什么特征? 哪些品牌的鱼竿质量好 光威悟法师和达瓦一击哪个好 有人了解大卫地板吗?怎么样呢? 咖啡店送 玻璃杯 使用次数 word打印,自定义范围打印,死活没办法把第二第三页双面打印在一张纸上?? 一般玻璃杯用多长时间刷一次和消毒 你们企业查应聘者毕业证吗? 请问工程性质公司的各部门绩效考核如何制定,执行和实施。 为什么我的word文档用范围打印打印出来的文件都是固定的那几页,换电脑也没用? 兄弟7360打印机 效果看图 求助各位大神 word文挡打印可以全打,也可以打当前页,但一设置范围打印就没反映了,为什么 请问。我的手机版优酷会员怎么取消自动续费,我用登的优酷为什 昆虫一定有外骨骼吗 虫子有骨头吗? 骨头重要吗?“克劳滴管”虫隐藏着怎样的秘密呢? 苍蝇蜘蛛蚊子有骨头吗? 昆虫属于无脊椎动物中的___,体内没有__ 什么昆虫硬骨是长在外面的? 蚂蚁有骨头吗? 没有骨头的昆虫怎么站立 所有的昆虫体表都具有外骨骼吗? 昆虫的若虫有外骨骼吗 毛毛虫有骨头吗 怎那样设置电脑桌面鼠标特效 系统桌面的鼠标特殊效果是怎么搞的? 文件里怎么设置鼠标特效? 怎么变电脑桌面上的鼠标?变图案和动画! 怎么设置电脑桌面上的鼠标像(花\笔....)之类的鼠标啊 我想在桌面上做些漂亮的效果,比如鼠标划过的轨迹有星星闪耀,像游戏里... 这种鼠标效果怎么弄? 电脑个性的桌面和鼠标动作是怎么弄出来的啊??? 奥克斯空调耗电量最少的是是哪种,及价格 javascript中用什么代码能把TEXTAREA中输入的简体中文转换成繁体字呢? 关于男朋友要写给女朋友的检讨书。 怎样能不再朋友圈里的广告 可编程控制器梯形图怎么变硬件接线图 hest是什么意思 HEsT丨As是什么手机 hestai是什么意思?这是什么语? bighest是什么意思? youarehest的意思 Which season does Frank like hest?是什么意思 最浪漫的诗或文章