本文是Java线程使用的入门级教程。Java平台从开始就被设计成为多线程环境,多线程的好处在于可以充分利用处理器资源,保证更快速的完成任务。
Java渠道从开端就被规划成为多线程环境。在你的主程序履行的时分,其它作业如碎片搜集和事情处理则是在后台进行的。本质上,你能够以为这些作业是线程。它们正好是体系管理线程,可是无论怎么,它们是线程。线程使你能够界说彼此独立的作业,彼此之间互不搅扰。体系将交流这些作业进或出CPU,这样(从外部看来)它们好象是一起运转的。
在你需求在你的程序中处理多个作业时,你也能够运用多个进程。这些进程能够是你自己创立的,你也能够操作体系线程。
你进行这些多作业处理,要运用几个不同的类或接口:
java.util.Timer类
javax.swing.Timer类
Thread类
Runnable接口
关于简略的作业,一般需求重复的,你能够运用java.util.Timer类告知它“每半秒钟做一次”。留意:大多数体系例程是运用毫秒的。半秒钟是500毫秒。
你期望Timer完结的使命是在java.util.TimerTask实例中界说的,其间运转的办法包括要履行的使命。这些在Hi类中进行了演示,其间字符串“Hi”重复地被显现在屏幕上,直到你按Enter键。
- importjava.util.*;
- publicclassHi{
- publicstaticvoidmain(Stringargs[])
- throwsjava.io.IOException{
- TimerTasktask=newTimerTask(){
- publicvoidrun(){
- System.out.println("Hi");
- }
- };
- Timertimer=newTimer();
- timer.schedule(task,0,500);
- System.out.println("PressENTERtostop");
- System.in.read(newbyte[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类派的上用场的当地。
为了阐明这第二种状况,下面的程序显现一个增加的计数器的值。美半秒钟计数器的数值增加,而且新的数值被显现。
- importjavax.swing.*;
- importjava.awt.*;
- importjava.awt.event.*;
- publicclassCount{
- publicstaticvoidmain(Stringargs[]){
- JFrameframe=newJFrame();
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- ContainercontentPane=frame.getContentPane();
- finalJLabellabel=newJLabel("",JLabel.CENTER);
- label.setFont(newFont("Serif",Font.PLAIN,36));
- contentPane.add(label,BorderLayout.CENTER);
- ActionListenerlistener=newActionListener(){
- intcount=0;
- publicvoidactionPerformed(ActionEvente){
- count++;
- label.setText(Integer.toString(count));
- }
- };
- Timertimer=newTimer(500,listener);
- timer.start();
- frame.setSize(300,100);
- frame.show();
- }
- }
上述程序的结果是:
假如你要做的不是一个简略的重复作业,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键完毕程序。
- importjava.io.*;
- importjava.net.*;
- publicclassBoth{
- publicstaticvoidmain(Stringargs[]){
- finalStringurlString=args[0];
- finalStringmessage=args[1];
- Threadthread1=newThread(){
- publicvoidrun(){
- try{
- URLurl=newURL(urlString);
- URLConnectionconnection=url.openConnection();
- InputStreamReaderisr=newInputStreamReader(
- connection.getInputStream());
- BufferedReaderreader=newBufferedReader(isr);
- intcount=0;
- while(reader.read()!=-1){
- count++;
- }
- System.out.println("Sizeis:"+count);
- reader.close();
- }catch(MalformedURLExceptione){
- System.err.println("BadURL:"+urlString);
- }catch(IOExceptione){
- System.err.println("I/OProblems");
- }
- }
- };
- thread1.start();
- Runnablerunnable=newRunnable(){
- publicvoidrun(){
- while(true){
- System.out.println(message);
- try{
- Thread.sleep(500);
- }catch(InterruptedExceptione){
- }
- }
- }
- };
- Threadthread2=newThread(runnable);
- thread2.start();
- try{
- System.out.println("PressENTERtostop");
- System.in.read(newbyte[10]);
- }catch(IOExceptione){
- System.out.println("I/Oproblems");
- }
- System.exit(0);
- }
- }
为有多种办法来处理线程,你选用哪种技能取决于你和你面对的条件。要成为一个有用的Java编程人员,虽然你一般不用学习Java编程言语的一切内容和中心库,可是线程是一个破例。你越早了解线程怎么作业和怎么运用线程,你将越早了解Java程序怎么作业和交互。
【修改引荐】
- 专题:Java有用开发全集_51CTO.COM
- Java开发者盛宴:JavaOne 2009技能前瞻
- http://developer.51cto.com/art/200904/119400.htm
- Flex衔接Java EE的技能挑选
- 高手Java中心技能学习笔记
知优网 » Java线程运用入门(java 线程使用)