Java创建线程的两个方法

操作方法

  • 01

    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? 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接口的方式来完成的。

(0)

相关推荐

  • sw怎么创建平面? sw创建平面的两种方法

    SolidWorks怎么创建平面,这主要使用两种方法创建,分别是“填充”和“平面区域”,请看下文详细介绍. 方法一:填充命令来造的平面 1.打开SolidWorks软件,新建一个零件文件. 2.进入草 ...

  • UG10.0怎么建模球刀? UG创建球刀的两种方法

    UG10.0自中想要创建球刀,该怎么创建呢?下面我们就来看看详细的教程. 方法一: 1.打开UG模型,在“应用模块”中选择“加工”,进入UG加工环境中. 2.选择“创建刀具”,弹出对话框选择端铣刀,命 ...

  • UG中使用圆弧线段创建圆柱体的两种方法

    UG NX软件中有直接生成圆柱实体的设计特征,也可以通过拉伸来生成圆柱.一般都是通过整圆截面线来完成,这里介绍的是仅以小段圆弧线来生成圆柱实体的技巧. 方法一: 1.首先直接插入圆弧命令,绘制一个四分 ...

  • AE创建蒙版/遮罩/mask的方法

    在AE中,因为版本不同,蒙版也叫做遮罩,对应英文为mask,AE提供了多种创建蒙版的方式,总体来说可分为两类:内部创建蒙版和外部引用,外部引用的意思是可将ps或Illustrator等外部制图软件中的 ...

  • Win7中轻松创建新用户的两种方法满足不同用户之间的需求

    使用windows7系统的用户们越来越多了,它的酷炫和强大已经吸引了一大批的人,对于那些家庭电脑或者共用电脑的用户们来说,为了方便会在电脑中创建多个登录用户,来满足不同用户们之间的需求,想必有很多新手 ...

  • win7手动创建桌面快捷方式的两种方法

    当用在安装一些应用程序时,通常程序会自动在桌面创建快捷方式,但也并非每个程序都为其创建快捷方式,故此想要在桌面中显示快捷方式,就需要手工进行创建,不过有很多人不知道如何创建,所以今天小编为大家带来了两 ...

  • Win10程序快速创建桌面快捷方式的两种方法

    我们使用电脑的习惯一般都是点击桌面上软件的快捷方式,把我们常用的软件在桌面创建个快捷程序,在我们需要使用的时候直接点击就可以了,快捷方式对于我们来说是很方便的一个设置.但是我们也经常会有这样一个失误, ...

  • Win10怎么创建桌面快捷方式?Win10创建桌面快捷方式的两种方法

    我们经常需要使用快捷方式来打开软件,那么如何在Win10系统中为软件创建桌面快捷方式呢?下面小编就给大家带来Win10创建桌面快捷方式的两种方法,一起来看看吧. 方法一. 右键需要创建快捷方式的程序, ...

  • revit如何创建明细表 revit中新建明细表的两种方法

    在revit中如何创建明细表?创建明细表.数量和材质提取,以确定并分析在项目中使用的构件和材质. 明细表是模型的另一种视图.命令行所在:“视图”选项卡“创建”面板“明细表”下拉列表中.好了,话不多说, ...