CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

如何使用线程

楼主xiaoran123()2006-03-15 17:37:33 在 Java / J2SE / 基础类 提问

如何使用线程 问题点数:75、回复次数:3Top

1 楼francis_zj(健健)回复于 2006-03-15 17:40:23 得分 75

Java平台从开始就被设计成为多线程环境。在你的主程序执行的时候,其它作业如碎片收集和事件处理则是在后台进行的。本质上,你可以认为这些作业是线程。它们正好是系统管理线程,但是无论如何,它们是线程。线程使你能够定义相互独立的作业,彼此之间互不干扰。系统将交换这些作业进或出CPU,这样(从外部看来)它们好象是同时运行的。  
   
  在你需要在你的程序中处理多个作业时,你也可以使用多个进程。这些进程可以是你自己创建的,你也可以操纵系统线程。  
   
  你进行这些多作业处理,要使用几个不同的类或接口:  
   
  java.util.Timer类    
  javax.swing.Timer类    
  Thread类    
  Runnable接口    
   
  对于简单的作业,通常需要重复的,你可以使用java.util.Timer类告诉它“每半秒钟做一次”。注意:大多数系统例程是使用毫秒的。半秒钟是500毫秒。  
   
  你希望Timer实现的任务是在java.util.TimerTask实例中定义的,其中运行的方法包含要执行的任务。这些在Hi类中进行了演示,其中字符串“Hi”重复地被显示在屏幕上,直到你按Enter键。  
   
    import   java.util.*;  
     
    public   class   Hi   {  
        public   static   void   main(String   args[])    
                    throws   java.io.IOException   {  
            TimerTask   task   =   new   TimerTask()   {  
                public   void   run()   {  
                    System.out.println("Hi");  
                }  
            };  
            Timer   timer   =   new   Timer();  
            timer.schedule(task,   0,   500);  
            System.out.println("Press   ENTER   to   stop");  
            System.in.read(new   byte[10]);  
            timer.cancel();  
        }  
    }  
   
  Java   Runtime   Environment工作的方式是只要有一个线程在运行,程序就不退出。这样,当取消被调用,没有其它线程在运行了,则程序退出。有一些系统线程在运行,如碎片收集程序。这些系统线程也被称为后台线程。后台线程的存在不影响运行环境被关闭,只有非后台线程保证运行环境不被关闭。  
   
  Javax.swing.Timer类与java.util.timer类的工作方式相似,但是有一些差别需要注意。第一,运行的作业被ActionListener接口的实现来定义。第二,作业的执行是在事件处理线程内部进行的,而不象java.util.Timer类是在它的外部。这是很重要的,因为它关系到Swing组件集是如何设计的。  
   
  如果你不熟悉Swing,它是一组可以被Java程序使用的图形组件。Swing被设计程被称为单线程的。这意味着对Swing类内部内容的访问必须在单个线程中完成。这个特定的线程是事件处理线程。这样,例如你想改变Label组件的文字,你不能仅仅调用Jlabel的setText方法。相反,你必须确认setText调用发生在事件处理线程中,而这正是javax.swing.Time类派的上用场的地方。  
   
  为了说明这第二种情况,下面的程序显示一个增加的计数器的值。美半秒钟计数器的数值增加,并且新的数值被显示。  
   
    import   javax.swing.*;  
    import   java.awt.*;  
    import   java.awt.event.*;  
     
    public   class   Count   {  
        public   static   void   main(String   args[])   {  
            JFrame   frame   =   new   JFrame();  
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
            Container   contentPane   =   frame.getContentPane();  
            final   JLabel   label   =   new   JLabel("",   JLabel.CENTER);  
            label.setFont(new   Font("Serif",   Font.PLAIN,   36));  
            contentPane.add(label,   BorderLayout.CENTER);  
            ActionListener   listener   =   new   ActionListener()   {  
                int   count   =   0;  
                public   void   actionPerformed(ActionEvent   e)   {  
                    count++;  
                    label.setText(Integer.toString(count));  
                }  
            };  
            Timer   timer   =   new   Timer(500,   listener);  
            timer.start();  
            frame.setSize(300,   100);  
            frame.show();  
        }  
    }  
   
  上述程序的结果是:49  
   
  万一你要做的不是一个简单的重复作业,java.lang.Thread类就派上了用场。它允许你自己控制基本功能。通过创建Thread的一个子类,你可以使你的系统脱离,并进行一个长时间运行的作业,如从网络上读取一个文件,而不阻碍你的其它程序的运行。这种长时间运行的作业将在run方法中定义。  
   
  第二种方式是创建Thread类的子类并在子类中实现run方法,或在实现runnable的类中实现run方法,并将这个实现传递给Thread的构造函数。  
   
  你可能会问有什么区别。Java编程语言仅支持单一继承。如果你设计的调用是除了Thread以外的其它类,你可以是你的类实现Runnable,而它可以是你的作业被执行。否则,你定义Thread的子类来运行你的Run方法,在处理过程中不再添加其它操作。  
   
  对于创建Thread子类的第三种情况,下面的程序生成了一个新的线程来计算一个特定URL的字符数,这个URL是通过命令行传递进来的。在这进行过程之中,实现Runnable的第四种情况被演示,打印出重复的消息。注意在实现Runnable的这后一种情况下,你必须提供重复消息的代码。你必须同时sleep,以分配时间并完成操作。在两种情况下,与使用Timer相比较。这段程序的最后一部分包含有你从命令行读取命令以触发程序结束。注意在系统读取URL并打印消息的同时,你总可以按Enter键结束程序。  
   
    import   java.io.*;  
    import   java.net.*;  
     
    public   class   Both   {  
        public   static   void   main(String   args[])   {  
            final   String   urlString   =   args[0];  
            final   String   message   =   args[1];  
            Thread   thread1   =   new   Thread()   {  
                public   void   run()   {  
                    try   {  
                        URL   url   =   new   URL(urlString);  
                        URLConnection   connection   =    
                                url.openConnection();  
                        InputStreamReader   isr   =   new    
                                InputStreamReader(  
                                        connection.getInputStream());  
                        BufferedReader   reader   =   new   BufferedReader(isr);  
                        int   count   =   0;  
                        while   (reader.read()   !=   -1)   {  
                            count++;  
                        }  
                        System.out.println("Size   is   :   "    
                                +   count);  
                        reader.close();  
                    }   catch   (MalformedURLException   e)   {  
                        System.err.println("Bad   URL:   "    
                                +   urlString);  
                    }   catch   (IOException   e)   {  
                        System.err.println("I/O   Problems");  
                    }  
                }  
            };  
            thread1.start();  
            Runnable   runnable   =   new   Runnable()   {  
                public   void   run()   {  
                    while(true)   {  
                        System.out.println(message);  
                        try   {  
                            Thread.sleep(500);  
                        }   catch   (InterruptedException   e)   {  
                        }  
                    }  
                }  
            };  
            Thread   thread2   =   new   Thread(runnable);  
            thread2.start();  
            try   {  
                System.out.println("Press   ENTER   to   stop");  
                System.in.read(new   byte[10]);  
            }   catch   (IOException   e)   {  
                System.out.println("I/O   problems");  
            }  
            System.exit(0);  
        }  
    }  
   
  因为有多种方式来处理线程,你选用哪种技术取决于你和你面临的条件。要成为一个有效的Java编程人员,尽管你通常不必学习Java编程语言的所有内容和核心库,但是线程是一个例外。你越早了解线程如何工作和如何使用线程,你将越早了解Java程序如何工作和交互。  
  Top

2 楼interpb(曾曾胡,深怕情多累美人!)回复于 2006-03-15 17:43:34 得分 0

看书   自己写代码!!Top

3 楼YuLimin(阿敏总司令:简单就是美—钻石闪闪您快结贴!)回复于 2006-03-16 18:07:04 得分 0

两位是否在演戏?Top

相关问题

  • 如何使用线程?
  • 困惑:子线程如何使用主线程的变量?
  • 在C++ BUILDER 中如何使用线程?
  • 如何在 VB 中使用多线程?
  • 如何使用多线程socket编程?
  • 如何使用vb.net的多线程
  • 如何使用线程的WaitFor?急问...
  • 如何在线程中使用TServerSocket\TclinetSocket
  • 如何使用“线程函数返回”这种方法终止线程执行?
  • 如何实现多线程。CreateThread如何使用?

关键词

  • 线程
  • 作业
  • swing
  • 系统
  • 组件
  • 执行
  • 接口
  • 类
  • 运行
  • 子类

得分解答快速导航

  • 帖主:xiaoran123
  • francis_zj

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo