选择显示字体大小

java多线程程序设计初步


  在java语言产生前,传统的程序设计语言的程序同一时刻只能单任务操作,效率非常低,例如程序往往在接收数据输入时发生阻塞,只有等到程序获得数据后才能继续运行。 随着inte.net的迅猛发展,这种状况越来越不能让人们忍受:如果网络接收数据阻塞,后台程序就处于等待状态而不继续任何操作,而这种阻塞是经常会碰到的,此时cpu资源被白白的闲置起来。如果在后台程序中能够同时处理多个任务,该多好啊!应inte.net技术而生的java语言解决了这个问题,多线程程序是java语言的一个很重要的特点。在一个java程序中,我们可以同时并行运行多个相对独立的线程,例如,我们如果创建一个线程来进行数据输入输出,而创建另一个线程在后台进行其它的数据处理,如果输入输出线程在接收数据时阻塞,而处理数据的线程仍然在运行。多线程程序设计大大提高了程序执行效率和处理能力。

  线程的创建

  我们知道java是面向对象的程序语言,用java进行程序设计就是设计和使用类,java为我们提供了线程类thread来创建线程,创建线程与创建普通的类的对象的操作是一样的,而线程就是thread类或其子类的实例对象。下面是一个创建启动一个线程的语句:

  thread thread1=new thread(); file://声明一个对象实例,即创建一个线程

  thread1.run(); file://用thread类中的run()方法启动线程

  从这个例子,我们可以通过thread()构造方法创建一个线程,并启动该线程。事实上,启动线程,也就是启动线程的run()方法,而thread类中的run()方法没有任何操作语句,所以这个线程没有任何操作。要使线程实现预定功能,必须定义自己的run()方法。java中通常有两种方式定义run()方法:

  通过定义一个thread类的子类,在该子类中重写run()方法。thread子类的实例对象就是一个线程,显然,该线程有我们自己设计的线程体run()方法,启动线程就启动了子类中重写的run()方法。

  通过runnable接口,在该接口中定义run()方法的接口。所谓接口跟类非常类似,主要用来实现特殊功能,如复杂关系的多重继承功能。在此,我们定义一个实现runnable() 接口的类,在该类中定义自己的run()方法,然后以该类的实例对象为参数调用thread类的构造方法来创建一个线程

  线程被实际创建后处于待命状态,激活(启动)线程就是启动线程的run()方法,这是通过调用线程的start()方法来实现的。

  下面一个例子实践了如何通过上述两种方法创建线程并启动它们:

  // 通过thread类的子类创建的线程

   class thread1 extends thread

    { file://自定义线程的run()方法

     public void run()

      {

       system.out.println("thread1 is running…");

      }

     }

   file://通过runnable接口创建的另外一个线程

  class thread2 implements runnable

   { file://自定义线程的run()方法

    public void run()

    {

     system.out.println("thread2 is running…");

    }

   }

   file://程序的主类'

   class multi_thread file://声明主类

    {

     plubic static void mail(string args[]) file://声明主方法

      {

       thread1 threadone=new thread1(); file://用thread类的子类创建线程

       thread threadtwo=new thread(new thread2()); file://用runnable接口类的对象创建线程

       threadone.start(); threadtwo.start(); file://strat()方法启动线程

      }

     }

  运行该程序就可以看出,线程threadone和threadtwo交替占用cpu,处于并行运行状态。可以看出,启动线程的run()方法是通过调用线程的start()方法来实现的(见上例中主类),调用start()方法启动线程的run()方法不同于一般的调用方法,调用一般方法时,必须等到一般方法执行完毕才能够返回start()方法,而启动线程的run()方法后,start()告诉系统该线程准备就绪可以启动run()方法后,就返回start()方法执行调用start()方法语句下面的语句,这时run()方法可能还在运行,这样,线程的启动和运行并行进行,实现了多任务操作。

  线程的优先级

  对于多线程程序,每个线程的重要程度是不尽相同,如多个线程在等待获得cpu时间时,往往我们需要优先级高的线程优先抢占到cpu时间得以执行;又如多个线程交替执行时,优先级决定了级别高的线程得到cpu的次数多一些且时间多长一些;这样,高优先级的线程处理的任务效率就高一些。

  java线程的优先级从低到高以整数1~10表示,共分为10级,设置优先级是通过调用线程对象的setpriority()方法,如上例中,设置优先级的语句为:

  thread1 threadone=new thread1(); file://用thread类的子类创建线程

  thread threadtwo=new thread(new thread2()); file://用runnable接口类的对象创建线程

  threadone.setpriority(6); file://设置threadone的优先级6

  threadtwo.setpriority(3); file://设置threadtwo的优先级3

  threadone.start(); threadtwo.start(); file://strat()方法启动线程

  这样,线程threadone将会优先于线程threadtwo执行,并将占有更多的cpu时间。该例中,优先级设置放在线程启动前,也可以在启动后进行设置,以满足不同的优先级需求。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons