本文是Java线程使用的入门级教程。Java平台从开始就被设计成为多线程环境,多线程的好处在于可以充分利用处理器资源,保证更快速的完成任务。

Java渠道从开端就被规划成为多线程环境。在你的主程序履行的时分,其它作业如碎片搜集和事情处理则是在后台进行的。本质上,你能够以为这些作业是线程。它们正好是体系管理线程,可是无论怎么,它们是线程。线程使你能够界说彼此独立的作业,彼此之间互不搅扰。体系将交流这些作业进或出CPU,这样(从外部看来)它们好象是一起运转的。

在你需求在你的程序中处理多个作业时,你也能够运用多个进程。这些进程能够是你自己创立的,你也能够操作体系线程。

你进行这些多作业处理,要运用几个不同的类或接口:

   java.util.Timer类
   javax.swing.Timer类
   Thread类
   Runnable接口

关于简略的作业,一般需求重复的,你能够运用java.util.Timer类告知它“每半秒钟做一次”。留意:大多数体系例程是运用毫秒的。半秒钟是500毫秒。

你期望Timer完结的使命是在java.util.TimerTask实例中界说的,其间运转的办法包括要履行的使命。这些在Hi类中进行了演示,其间字符串“Hi”重复地被显现在屏幕上,直到你按Enter键。

  1. importjava.util.*;
  2. publicclassHi{
  3.  publicstaticvoidmain(Stringargs[])
  4.  throwsjava.io.IOException{
  5.   TimerTasktask=newTimerTask(){
  6.   publicvoidrun(){
  7.    System.out.println("Hi");
  8.   }
  9.  };
  10.  Timertimer=newTimer();
  11.  timer.schedule(task,0,500);
  12.  System.out.println("PressENTERtostop");
  13.  System.in.read(newbyte[10]);
  14.  timer.cancel();
  15. }
  16. }

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类派的上用场的当地。

为了阐明这第二种状况,下面的程序显现一个增加的计数器的值。美半秒钟计数器的数值增加,而且新的数值被显现。

  1. importjavax.swing.*;
  2. importjava.awt.*;
  3. importjava.awt.event.*;
  4. publicclassCount{
  5.  publicstaticvoidmain(Stringargs[]){
  6.   JFrameframe=newJFrame();
  7.   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  8.   ContainercontentPane=frame.getContentPane();
  9.   finalJLabellabel=newJLabel("",JLabel.CENTER);
  10.   label.setFont(newFont("Serif",Font.PLAIN,36));
  11.   contentPane.add(label,BorderLayout.CENTER);
  12.   ActionListenerlistener=newActionListener(){
  13.    intcount=0;
  14.    publicvoidactionPerformed(ActionEvente){
  15.     count++;
  16.     label.setText(Integer.toString(count));
  17.    }
  18.   };
  19.   Timertimer=newTimer(500,listener);
  20.   timer.start();
  21.   frame.setSize(300,100);
  22.   frame.show();
  23.  }
  24. }

上述程序的结果是:

Java线程运用入门(java 线程使用)  java线程 入门 第1张

假如你要做的不是一个简略的重复作业,java.lang.Thread类就派上了用场。它答应你自己操控基本功能。经过创立Thread的一个子类,你能够使你的体系脱离,并进行一个长期运转的作业,如从网络上读取一个文件,而不阻止你的其它程序的运转。这种长期运转的作业将在run办法中界说。 更多内容请看Java环境装置装备、Solaris基础知识入门、Java编程开发手册专题,或进入评论组评论。

#p#

第二种办法是创立Thread类的子类并在子类中完结run办法,或在完结runnable的类中完结run办法,并将这个完结传递给Thread的结构函数。

你可能会问有什么区别。Java编程言语仅支撑单一承继。假如你规划的调用是除了Thread以外的其它类,你能够是你的类完结Runnable,而它能够是你的作业被履行。不然,你界说Thread的子类来运转你的Run办法,在处理进程中不再增加其它操作。

关于创立Thread子类的第三种状况,下面的程序生成了一个新的线程来核算一个特定URL的字符数,这个URL是经过指令行传递进来的。在这进行进程之中,完结Runnable的第四种状况被演示,打印出重复的音讯。留意在完结Runnable的这后一种状况下,你有必要供给重复音讯的代码。你有必要一起sleep,以分配时刻并完结操作。在两种状况下,与运用Timer相比较。这段程序的***一部分包括有你从指令行读取指令以触发程序完毕。留意在体系读取URL并打印音讯的一起,你总能够按Enter键完毕程序。

  1. importjava.io.*;
  2. importjava.net.*;
  3. publicclassBoth{
  4.  publicstaticvoidmain(Stringargs[]){
  5.   finalStringurlString=args[0];
  6.   finalStringmessage=args[1];
  7.   Threadthread1=newThread(){
  8.    publicvoidrun(){
  9.     try{
  10.      URLurl=newURL(urlString);
  11.      URLConnectionconnection=url.openConnection();
  12.      InputStreamReaderisr=newInputStreamReader(
  13.       connection.getInputStream());
  14.      BufferedReaderreader=newBufferedReader(isr);
  15.      intcount=0;
  16.      while(reader.read()!=-1){
  17.        count++;
  18.      }
  19.      System.out.println("Sizeis:"+count);
  20.      reader.close();
  21.     }catch(MalformedURLExceptione){
  22.      System.err.println("BadURL:"+urlString);
  23.     }catch(IOExceptione){
  24.      System.err.println("I/OProblems");
  25.     }
  26.    }
  27.   };
  28.   thread1.start();
  29.   Runnablerunnable=newRunnable(){
  30.    publicvoidrun(){
  31.     while(true){
  32.      System.out.println(message);
  33.      try{
  34.       Thread.sleep(500);
  35.      }catch(InterruptedExceptione){
  36.      }
  37.     }
  38.    }
  39.   };
  40.   Threadthread2=newThread(runnable);
  41.   thread2.start();
  42.   try{
  43.    System.out.println("PressENTERtostop");
  44.    System.in.read(newbyte[10]);
  45.   }catch(IOExceptione){
  46.   System.out.println("I/Oproblems");
  47.  }
  48.  System.exit(0);
  49.  }
  50. }

为有多种办法来处理线程,你选用哪种技能取决于你和你面对的条件。要成为一个有用的Java编程人员,虽然你一般不用学习Java编程言语的一切内容和中心库,可是线程是一个破例。你越早了解线程怎么作业和怎么运用线程,你将越早了解Java程序怎么作业和交互。

【修改引荐】

  1. 专题:Java有用开发全集_51CTO.COM
  2. Java开发者盛宴:JavaOne 2009技能前瞻
  3. http://developer.51cto.com/art/200904/119400.htm
  4. Flex衔接Java EE的技能挑选
  5. 高手Java中心技能学习笔记
转载请说明出处
知优网 » Java线程运用入门(java 线程使用)

发表评论

您需要后才能发表评论