Java学习

java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已经搬家了,新的地址是 http://www.javaly.cn 如果有对文章有任何疑问或者有任何不懂的地方,欢迎到www.javaly.cn (Java乐园)指出,我会尽力帮助解决。一起进步

 

多线程使用示例1

12.3 多线程使用示例

         多线程技术对于初学者来说,是编程思维的一种跳跃,在实际学习时,一定要熟悉线程的基础知识,掌握线程的实现方式,然后就是开始大量的进行实践,从实践中领悟线程编程的奥妙以及实现的原理。

         下面通过几个常见的例子演示多线程的基本使用。

12.3.1 定时炸弹

         定时炸弹是在电影中常见的一种装置,在该部分就使用多线程技术模拟该功能。实现的功能为:在程序启动以后进行倒计时,当60秒以后程序结束,在程序运行时可以在控制台输入quit控制线程(炸弹)的暂停。

         在该示例程序中,开启了一个系统线程(main方法所在的线程),该线程的作用是启动模拟定时炸弹的线程,并且在控制台接受用户的输入,并判断输入的内容是否为quit,如果是则结束模拟定时炸弹的线程,程序结束。

         首先来看一下使用继承Thread类的方式实现多线程时的代码示例,代码如下:

                   package example1;

import java.io.*;

/**

 * 模拟定时炸弹线程

 */

public class TestTimeBomb1 {

         public static void main(String[] args) {

                   //创建线程和启动线程

                   TimeBombThread tbt = new TimeBombThread();

                   //接受控制台输入

                   BufferedReader br = new BufferedReader(

                                               new InputStreamReader(System.in));

                   String line;

                   try{

                            while(true){

                                     System.out.println("输入quit结束线程:");

                                     //获得控制台输入

                                     line = br.readLine();

                                     //判断是否是quit

                                     if(line.equals("quit")){

                                               tbt.stopThread(); //结束线程

                                               break; //结束循环

                                     }

                            }

                   }catch(Exception e){}

         }

}

                   package example1;

/**

 * 使用继承Thread类的方式模拟定时炸弹逻辑

 */

public class TimeBombThread extends Thread {

         int n;

         boolean isRun;

         public TimeBombThread(){

                   n = 60;

                   isRun = true;

                   start();//启动线程

         }

        

         public void run(){

                   try{

                            while(isRun){

                                     Thread.sleep(1000); //延迟1

                                     System.out.println("剩余时间:" + n);

                                     if(n <= 0){

                                               isRun = false; //结束线程

                                               System.out.println("炸弹爆炸!");

                                               break;

                                     }

                                     n--; //时间减少1

                            }

                   }catch(Exception e){}

         }

        

         public void stopThread(){

                   isRun = false;

         }

}

         在该示例代码中,TestTimeBomb1类中包含的是系统线程,在系统线程中启动模拟定时炸弹的TimeBombThread线程,然后在TestTimeBomb1中接收用户的控制台输入,如果输入的内容是quit则结束线程,程序结束,否则忽略用户的输入,继续等待用户输入。按照前面介绍的IO知识,在接收控制台输入时readLine是阻塞方法,也就是该方法在未获得用户输入时会阻塞系统线程的执行,使系统线程进入到等待状态,等待用户输入。而TimeBombThread实现的逻辑是每隔1秒钟减少一次数值,并输出剩余时间,当剩余时间为零时,结束TimeBombThread线程。这样两个线程就同时工作了,系统线程等待用户输入的同时,模拟定时炸弹的线程继续执行,这样程序中就包含了两个同时执行的流程。

         在这里需要特别说明的是,如何控制线程的结束?在本程序中,使用的是让线程自然死亡的方式,在实际控制线程时,当线程的run方法执行结束则线程自然死亡,所以在本程序中通过控制isRun变量使得线程可以自然结束,从而释放线程占用的资源。

         同样的功能也可以使用TimerTimerTask组合的方式实现,实现的代码如下所示:

                   package example1;

import java.io.*;

/**

 * 模拟定时炸弹线程

 */

public class TestTimeBomb2 {

         public static void main(String[] args) {

                   //创建线程和启动线程

                   TimeBombTimerTask tbtt = new TimeBombTimerTask();

                   //接受控制台输入

                   BufferedReader br = new BufferedReader(

                                               new InputStreamReader(System.in));

                   String line;

                   try{

                            while(true){

                                     System.out.println("输入quit结束线程:");

                                     //获得控制台输入

                                     line = br.readLine();

                                     //判断是否是quit

                                     if(line.equals("quit")){

                                               tbtt.stopThread(); //结束线程

                                               break; //结束循环

                                     }

                            }

                   }catch(Exception e){}

         }

}

package example1;

import java.util.*;

/**

 * 使用TimerTimerTask组合模拟定时炸弹

 */

public class TimeBombTimerTask extends TimerTask {

         int n;

         Timer t;

         boolean isRun;

         public TimeBombTimerTask(){

                   n = 60;

                   isRun = true;

                   t = new Timer();

                   t.schedule(this, 0); //启动线程

         }

        

         public void run() {

                   try{

                            while(isRun){

                                     Thread.sleep(1000); //延迟1

                                     System.out.println("剩余时间:" + n);

                                     if(n <= 0){

                                               stopThread(); //结束线程

                                               System.out.println("炸弹爆炸!");

                                               break;        //结束循环

                                     }

                                     n--; //时间减少1

                            }

                   }catch(Exception e){}

         }

        

         public void stopThread(){

                   isRun = false;

                   t.cancel();

         }

}

         在该示例代码中,实现的原理和前面的类似,TestTimeBomb2类实现系统线程,功能是启动模拟定时炸弹的线程,并接收用户的控制台输入。而TimeBombTimerTask类实现模拟定时炸弹的线程,在该类内部包含启动线程的Timer对象,当构造该类的对象时,不仅完成该类的初始化,而且启动线程。

         在控制Timer启动的线程结束时,首先结束当前的TimerTask线程,然后再调用Timer对象的cancel方法结束Timer对象的线程,这样才可以真正停止这种方式启动的线程。

         至于使用实现Runnable方式实现线程的方式,和继承Thread类的实现几乎一致,读者可以根据第一种方式的实现独自进行实现,这里就不再重复实现了。

posted on 2009-06-15 13:22 找个美女做老婆 阅读(454) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

公告

本blog已经搬到新家了, 新家:www.javaly.cn
 http://www.javaly.cn

常用链接

留言簿(6)

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜