java创建多线程实现的方式:
Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程,有两种方法:
1、需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法;
2、实现Runnalbe接口,重载Runnalbe接口中的run()方法。
为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?
在Java中,类仅支持单继承,也就是说,当定义一个新的类的时候,它只能扩展一个外部类.这样,如果创建自定义线程类的时候是通过扩展 Thread类的方法来实现的,那么这个自定义类就不能再去扩展其他的类,也就无法实现更加复杂的功能。因此,如果自定义类必须扩展其他的类,那么就可以使用实现Runnable接口的方法来定义该类为线程类,这样就可以避免Java单继承所带来的局限性。还有一点最重要的就是使用实现Runnable接口的方式创建的线程可以处理同一资源,从而实现资源的共享.
下面用一个例子说明如何用两种方法实现:
假设一个影院有三个售票口,分别用于向儿童、成人和老人售票。影院为每个窗口放有100张电影票,分别是儿童票、成人票和老人票。三个窗口需要同时卖票,而现在只有一个售票员,这个售票员就相当于一个CPU,三个窗口就相当于三个线程。通过程序来看一看是如何创建这三个线程的。
第一种继承Thread实现:
/** * 通过继承Thread,来实现多线程程序 */ public class MutliThread extends Thread{ private int ticket = 100; public MutliThread(){ } public MutliThread (String name){ super(name); } public void run(){ while(ticket > 0){ System.out.println(ticket-- + " is saled by " + Thread.currentThread().getName()); } } }
/** *main函数, 测试MutliThread多线程方法 */ 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(); } }
程序中定义一个线程类,它扩展了Thread类。利用扩展的线程类在MutliThreadDemo类的主方法中创建了三个线程对象,并通过start()方法分别将它们启动。
从结果可以看到,每个线程分别对应100张电影票,之间并无任何关系,这就说明每个线程之间是平等的,没有优先级关系,因此都有机会得到CPU的处理。但是结果显示这三个线程并不是依次交替执行,而是在三个线程同时被执行的情况下,有的线程被分配时间片的机会多,票被提前卖完,而有的线程被分配时间片的机会比较少,票迟一些卖完。
第二种实现Runnabke接口:
/** * 通过是实现Runnable接口,实现多线程的使用 */ public class MutliThread implements Runnable{ private int ticket = 100; private String name; MutliThread(String name){ this.name = name; } public void run(){ while(ticket > 0){ System.out.println(ticket-- + " is saled by " + name); } } }
/** *main函数,测试Runnable多线程 */ public class MutliThreadDemo{ public static void main(String[] args){ MutliThread m1 = new MutliThread("Windows 1"); MutliThread m2 = new MutliThread("Windows 2"); MutliThread m3 = new MutliThread("Windows 3"); Thread t1 = new Thread(m1); Thread t2 = new Thread(m2); Thread t3 = new Thread(m3); t1.start(); t2.start(); t3.start(); } }
第二个例子:
现实中也存在这样的情况,比如模拟一个火车站的售票系统,假如当日从A地发往B地的火车票只有100张,且允许所有窗口卖这100张票,那么每一个窗口也相当于一个线程,但是这时和前面的例子不同之处就在于所有线程处理的资源是同一个资源,即100张车票。
代码:
/** * 通过Runable实现资源共享 */ public class MutliThread implements Runnable{ private int ticket = 100; public void run(){ while(ticket > 0){ System.out.println(ticket-- + "is saled by : " + Thread.currentThread().getName()); } } }
/** *main函数测试MutliThread资源共享程序 */ public class MutliThreadDemo{ public static void main(String[] args){ MutliThread m = new MutliThread(); Thread t1 = new Thread(m); Thread t2 = new Thread(m); Thread t3 = new Thread(m); t1.start(); t2.start(); t3.start(); } }
结果正如前面分析的那样,程序在内存中仅创建了一个资源,而新建的三个线程都是基于访问这同一资源的,并且由于每个线程上所运行的是相同的代码,因此它们执行的功能也是相同的。