一、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张车票。如果还用前面的方式来创建线程显然是无法实现的,这种情况该怎样处理呢?看下面这个程序,程序代码如下所示:
+ View Code
结果正如前面分析的那样,程序在内存中仅创建了一个资源,而新建的三个线程都是基于访问这同一资源的,并且由于每个线程上所运行的是相同的代码,因此它们执行的功能也是相同的。
可见,如果现实问题中要求必须创建多个线程来执行同一任务,而且这多个线程之间还将共享同一个资源,那么就可以使用实现Runnable接口的方式来创建多线程程序。而这一功能通过扩展Thread类是无法实现的,读者想想看,为什么?
实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,从而特别适合多个具有相同代码的线程去处理同一资源的情况。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。
二、Java语言: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接口的方式来完成的。
三、火车票抢票软件哪个好2021年火车票抢票软件排行榜
1、哪个抢票软件好2、请教高手:抢票软件哪个好?3、抢火车票什么软件最好4、手机订火车票哪个软件最好?哪个抢票软件好
抢票软件效率较高的有360抢票王、携程旅行、网易火车票等,如下:
1、360抢票王
云端抢票,全新云端监控,一键下单,不用盯着手机也能自动出票。预约抢票,提前预约未开放购买的车票,放票后快人一步自动购买。
余票监控,退票余票进行实时监控,绝不放过任何漏网之鱼的车票。成功通知,抢票成功后自动支付并以短信通知用户,抢票姿势优雅。失败全退,360抢票王自动抢票,抢不到全额退款,绝地安全放心。
2、携程旅行
随时随地,火车票、汽车票、机票等多种内容极速秒抢票。特惠低价,各种价格、各种组合、航司直销等方便又优惠。全站搜索,集目的地、酒店、景点、火车票等功能于一体。旅行日程,每日路线地图轻松看,外站行程轻松导入查看。
3、网易火车票
一键抢票,实时监控退票和余票,让抢票更安心。双通道抢票,全面网罗所有票源,下单更加快速。提前2个月预售火车票,无票在买区间票全天24小时为您服务。支持红包购买,还有多种票种任你选择。
4、去哪儿旅行
比价查询全网航线机票,还有特价提醒、航班动态、价格趋势等功能,让轻松出行。多种方式查询火车时刻表,一键下单直接购票。根据GPS定位搜索用户周边餐饮、娱乐等生活服务,涵盖了多个热门团购平台。
联系旅行当地精通吃喝玩乐达人,享受专属的私人旅行。自动搜索全网性价比最高的产品和最优质的旅行服务信息。
5、铁友火车票
抢票神器,帮助用户轻松抢票,上车补票,捡漏票,应有尽有。随时随地查看余票,让你了解购票形式。
承接12306官方出票渠道,正轨票源让用户放心抢票。令人激爽的抢票体验,预约抢票,比别人抢先一步。自动检索买票站点,支持先上车,再补票,让你出行更安心。退票还20%手续费,将节省进行到底。
请教高手:抢票软件哪个好?请教高手火车票抢票软件哪个好:抢票软件智行火车票、360抢票王、UC浏览器、gohome、携程好。
1、智行火车票
智行火车票火车票抢票软件哪个好,这是时下比较好火车票抢票软件哪个好的一款抢购火车票火车票抢票软件哪个好的软件。这款软件可以实时监控票数的多少,数据也是与铁道部数据实时同步。很多用户都已经用它成功的抢到车票,但可能会出现扣费情况。
2、360抢票王
360抢票王官方下载版自动拦截钓鱼网站,自动登录,自动排队,实现全自动操作。360抢票王也是值得推荐的抢票工具,只需简单设置,就可以不间断的帮你刷票来提高抢票效率。所以总体来说抢票成功的概率也比较大。
3、UC浏览器
UC浏览器是首款基于大数据分析用户兴趣,融入信息流式交互体验,为用户提供个性化阅读体验的手机浏览器。UC浏览器抢票功能,也是非常值得推荐的,优势在于可以****,是一款经济实惠的产品。
4、gohome
gohome是一款针对 12306.cn网上购买火车票网站的自动订票程序,可以容易的在网上订购火车票,gohome这款软件目前来说还有人用,不过不能订学生票,这个需要java运行环境的。
5、携程
携程是一个在线票务服务公司,创立于1999年,总部设在中国上海。提供酒店预订、机票查询、旅游度假、火车票、汽车票、门票预订一站式服务提供。携程旅游推出一个云抢票功能,携程作为在线旅游平台现在为用户提供抢票服务。
抢火车票什么软件最好
抢火车票软件推荐:铁路12306、智行火车票app、铁友火车票、高铁管家、同程火车票。
1、铁路12306
铁路12306手机版是中国铁路客户服务中心官方推出火车票抢票软件哪个好的安卓客户端火车票抢票软件哪个好,铁路12306手机版可以查询旅客列车时刻表、票价、列车正晚点、车票余票、售票代售点、货物运价、车辆技术参数以及有关客货运规章。
2、智行火车票app
智行火车票app是一款非常实用的12306手机购票软件。它不仅实现火车票抢票软件哪个好了火车票查询火车票抢票软件哪个好,预定和购买等功能,还对12306购票流程进行大量优化,使用户购票更加快捷。
3、铁友火车票
铁友火车票手机版是一款火车票查询软件。通过铁友火车票手机版你可以很方便的火车票抢票软件哪个好了解火车票信息,购买需要的火车票。
4、高铁管家
高铁管家是“航班管家”的兄弟产品,会为您提供全程的商旅信息查询服务。
5、同程火车票
同程火车票app是一款非常实用、便捷的旅游出行必备软件.
网购火车票选上下铺:
1、在网上订票原则是系统随机自动生成上、中、下铺的。
2、如果只买一张下铺的话,在12306网站用A和B的身份证同时订票.
参考资料来源:
百度百科-铁路12306
百度百科-铁友火车票
百度百科-高铁管家
百度百科-同程火车票
手机订火车票哪个软件最好?1、携程旅行
携程旅行是携程网开发的手机APP火车票抢票软件哪个好,携程旅行还针对手机抢票进行火车票抢票软件哪个好了定制。为了吸引更多的用户,携程推出了加强版抢票功能,不过前提是需要加钱。
携程旅行并没有针对春运设置独立的抢票入口,而是在进入常规的火车票购买入口后,在再从左下角的抢票入口中进行抢票。除了常规的抢票之外,携程还有余票监控的功能。携程旅行推出的抢票功能主要分为两种,第一种就是免费抢票,不过能不能抢到就真不清楚,重点是携程推出的付费代抢票功能。
优缺点火车票抢票软件哪个好:携程旅行提供了包括常规抢票和付费抢票的方式,付费抢票的功能确实让不少人抢到了回家的车票。不过携程的缺点在于使用过于繁琐,携程还可以对其进行优化。
2、去哪儿旅行
去哪儿旅行与携程旅行一样,是一款主要为旅游而产生的手机APP。去哪儿旅行同样针对春运抢票进行了改动,它同样提供了加钱抢票服务,据说效果相当不错。
优缺点:去哪儿旅行与携程网的抢票服务相差不多,只是没有提供人工代抢票服务,不过成功率也并不比携程网差太多,抢票并不是用人工抢就可以得到搞成功率的。
3、猎豹浏览器
猎豹浏览器是国内最早一批开始支持互联网抢票的程序,即使到了猎豹浏览器手机版,火车票抢票软件哪个好他们依然没有忘记让当年它们声名鹊起的浏览器抢票功能。
猎豹浏览器在APP的右上角中可以看到非常显眼的抢票两字,进入浏览器之后,可以看见网址导航上有抢火车票工具栏,也清晰提示今天可以抢到年廿九的火车票。
猎豹浏览器手机版同样提供了增加抢到票概率的功能,分别是20块钱增加50%概率和30块钱增加80%的概率,而小编认为猎豹浏览器同样是通过服务器云端来进行抢票,这样可以减少用户在通讯中的网络延迟问题,增加抢票成功率。
优缺点:使用猎豹浏览器抢票的用户有多少并不清楚,不过使用中较少的步骤会让用户更加舒服。同样采取云端抢票技术的它们成律应该与携程、去哪儿非常接近。
4、飞猪
飞猪是阿里巴巴旗下“阿里旅行”改名并独立出来的APP,依附阿里巴巴庞大的用户群体,飞猪的影响力同样非常巨大。与前两位不同的是,飞猪同样推出了春运抢票功能,而帮助抢票的功能也于上面的几家大同小异。
在飞猪的首页界面中,可以非常清楚地看到大红色的春运抢票入口,飞猪抢票的主界面比较杂乱,不过好的是在底不中间有快捷入口,不过下一层还不是抢票界面,需要继续在底层中点击抢票,才能最终进入到抢票界面。
优缺点:飞猪的抢票功能入口非常明显,不过不足的地方是从打开APP到抢票界面需要非常多的步骤,繁琐的操作相当考验用户的耐心。
5、铁路12306
《铁路12306》是中国铁路客户服务中心官方推出的安卓客户端,下载量达到将近1600万次。也是第一款上架的火车票票务APP软件。《铁路12306》是中国最具权威的火车票票务服务APP软件。
《铁路12306》可以查询旅客列车时刻表、票价、列车正晚点、车票余票、售票代售点、货物运价、车辆技术参数以及有关客货运规章,铁路货运大客户也可通过《铁路12306》办理业务。
文章分享结束,Java实现火车票售票系统_火车售票系统java程序和java怎么让一个方法实现线程的答案你都知道了吗?欢迎再次光临本站哦!