本文共 4378 字,大约阅读时间需要 14 分钟。
2015年11月19日10:05:31
作者:数据分析玩家
题目:现实中创建线程究竟该用第几种方式
例子1:
//用第一种方法创建线程:每个线程处理的是不同的资源
//每个线程分别对应20张电影票,之间并无任何关系,这就说明每个线程之间是平等的,没有优先级关系
class Tc extends Thread { private int tickets = 20;//每个线程各自卖20张票 public String name ; public Tc(String name) { this.name = name; } public void run() { while(tickets > 0) { System.out.printf("%s窗口正在售%d张票\n",name,tickets); tickets --; } } } public class zhang3 { public static void main(String[] args) { Tc t1 = new Tc("老人窗口----"); t1.run();//实现一个窗口卖票 Tc t2 = new Tc("-------儿童窗口"); t2.run();//不同的类对象,其属性占用不同的内存空间,这是根本 Tc t3 = new Tc("---中年窗口---"); t3.run(); } } /* 运行结果: 老人窗口----窗口正在售20张票 老人窗口----窗口正在售19张票 老人窗口----窗口正在售18张票 老人窗口----窗口正在售17张票 老人窗口----窗口正在售16张票 老人窗口----窗口正在售15张票 老人窗口----窗口正在售14张票 老人窗口----窗口正在售13张票 老人窗口----窗口正在售12张票 老人窗口----窗口正在售11张票 老人窗口----窗口正在售10张票 老人窗口----窗口正在售9张票 老人窗口----窗口正在售8张票 老人窗口----窗口正在售7张票 老人窗口----窗口正在售6张票 老人窗口----窗口正在售5张票 老人窗口----窗口正在售4张票 老人窗口----窗口正在售3张票 老人窗口----窗口正在售2张票 老人窗口----窗口正在售1张票 -------儿童窗口窗口正在售20张票 -------儿童窗口窗口正在售19张票 -------儿童窗口窗口正在售18张票 -------儿童窗口窗口正在售17张票 -------儿童窗口窗口正在售16张票 -------儿童窗口窗口正在售15张票 -------儿童窗口窗口正在售14张票 -------儿童窗口窗口正在售13张票 -------儿童窗口窗口正在售12张票 -------儿童窗口窗口正在售11张票 -------儿童窗口窗口正在售10张票 -------儿童窗口窗口正在售9张票 -------儿童窗口窗口正在售8张票 -------儿童窗口窗口正在售7张票 -------儿童窗口窗口正在售6张票 -------儿童窗口窗口正在售5张票 -------儿童窗口窗口正在售4张票 -------儿童窗口窗口正在售3张票 -------儿童窗口窗口正在售2张票 -------儿童窗口窗口正在售1张票 ---中年窗口---窗口正在售20张票 ---中年窗口---窗口正在售19张票 ---中年窗口---窗口正在售18张票 ---中年窗口---窗口正在售17张票 ---中年窗口---窗口正在售16张票 ---中年窗口---窗口正在售15张票 ---中年窗口---窗口正在售14张票 ---中年窗口---窗口正在售13张票 ---中年窗口---窗口正在售12张票 ---中年窗口---窗口正在售11张票 ---中年窗口---窗口正在售10张票 ---中年窗口---窗口正在售9张票 ---中年窗口---窗口正在售8张票 ---中年窗口---窗口正在售7张票 ---中年窗口---窗口正在售6张票 ---中年窗口---窗口正在售5张票 ---中年窗口---窗口正在售4张票 ---中年窗口---窗口正在售3张票 ---中年窗口---窗口正在售2张票 ---中年窗口---窗口正在售1张票*/
例子2:
//用第二中方式来创建线程:同样每个线程可以处理不同的资源 class Tc implements Runnable { private int tickets = 20;//每个线程各自卖20张票 public String name ; public Tc(String name) { this.name = name; } public void run() { while(tickets > 0) { System.out.printf("%s窗口正在售%d张票\n",name,tickets); tickets --; } } } public class zhang4 { public static void main(String[] args) { Tc aa = new Tc("老人窗口----"); Thread t1 = new Thread(aa); t1.run();//实现一个窗口卖票 Tc bb = new Tc("-------儿童窗口"); Thread t2 = new Thread(bb); t2.run();//不同的类对象,其属性占用不同的内存空间,这是根本 Tc cc = new Tc("---中年窗口---"); Thread t3 = new Thread(cc); t3.run(); } } /* 运行结果:和上面的程序相同 老人窗口----窗口正在售20张票 老人窗口----窗口正在售19张票 老人窗口----窗口正在售18张票 老人窗口----窗口正在售17张票 老人窗口----窗口正在售16张票 老人窗口----窗口正在售15张票 老人窗口----窗口正在售14张票 老人窗口----窗口正在售13张票 老人窗口----窗口正在售12张票 老人窗口----窗口正在售11张票 老人窗口----窗口正在售10张票 老人窗口----窗口正在售9张票 老人窗口----窗口正在售8张票 老人窗口----窗口正在售7张票 老人窗口----窗口正在售6张票 老人窗口----窗口正在售5张票 老人窗口----窗口正在售4张票 老人窗口----窗口正在售3张票 老人窗口----窗口正在售2张票 老人窗口----窗口正在售1张票 -------儿童窗口窗口正在售20张 -------儿童窗口窗口正在售19张 -------儿童窗口窗口正在售18张 -------儿童窗口窗口正在售17张 -------儿童窗口窗口正在售16张 -------儿童窗口窗口正在售15张 -------儿童窗口窗口正在售14张 -------儿童窗口窗口正在售13张 -------儿童窗口窗口正在售12张 -------儿童窗口窗口正在售11张 -------儿童窗口窗口正在售10张 -------儿童窗口窗口正在售9张票 -------儿童窗口窗口正在售8张票 -------儿童窗口窗口正在售7张票 -------儿童窗口窗口正在售6张票 -------儿童窗口窗口正在售5张票 -------儿童窗口窗口正在售4张票 -------儿童窗口窗口正在售3张票 -------儿童窗口窗口正在售2张票 -------儿童窗口窗口正在售1张票 ---中年窗口---窗口正在售20张票 ---中年窗口---窗口正在售19张票 ---中年窗口---窗口正在售18张票 ---中年窗口---窗口正在售17张票 ---中年窗口---窗口正在售16张票 ---中年窗口---窗口正在售15张票 ---中年窗口---窗口正在售14张票 ---中年窗口---窗口正在售13张票 ---中年窗口---窗口正在售12张票 ---中年窗口---窗口正在售11张票 ---中年窗口---窗口正在售10张票 ---中年窗口---窗口正在售9张票 ---中年窗口---窗口正在售8张票 ---中年窗口---窗口正在售7张票 ---中年窗口---窗口正在售6张票 ---中年窗口---窗口正在售5张票 ---中年窗口---窗口正在售4张票 ---中年窗口---窗口正在售3张票 ---中年窗口---窗口正在售2张票 ---中年窗口---窗口正在售1张票*/
这说明当处理的是不同的资源的时候,两种方式都可以使用
例子3:
//接着用第二中方式创建线程:多个线程处理的是同一资源 class Tc implements Runnable { private int tickets = 10000;//3个线程一共处理100张票 public void run() { while(true) { synchronized("zhang") { if(tickets > 0) { System.out.printf("%s窗口正在售%d张票\n",Thread.currentThread().getName(),tickets); tickets --; } else break; } } } } public class zhang5 { public static void main(String[] args) { Tc aa = new Tc(); Thread t1 = new Thread(aa); //aa对象 t1.setName("老人窗口"); t1.start();//实现一个窗口卖票 Thread t2 = new Thread(aa); //aa对象 t2.setName("儿童窗口"); t2.start();//不同的类对象,其属性占用不同的内存空间,这是根本 Thread t3 = new Thread(aa); //aa对象 t3.setName("中年窗口"); t3.start(); } } /* 运行结果是:三个售票口共同处理1000张票 */综上,我们可以得出结论:
实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。
这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立, 从而特别适合多个具有相同代码的线程去处理同一资源的情况。 这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。 因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。转载地址:http://qfgzb.baihongyu.com/