Java语言多线程技术应用研究
作者:林铁瀛
来源:《科技创新导报》2011年第11期
摘 要:多线程编程是Java语言的一个很重要的特点,它是面向对象程序设计的关键技术之一。本文简要的探讨了Java语言多线程的基本技术,就线程的创建、线程控制和调度及线程同步等处理技术做了相关探讨。
关键词:多线程 创建 控制 同步 应用
中图分类号:G633.3 文献标识码:A 文章编号:1674-098X(2011)04(b)-0022-01
多线程程序是Java语言的一个很重要的特点,在一个Java程序中,可以同时并行运行多个相对独立的线程。线程是一段完成某个特定功能的语句体,一个线程是一个程序内部单个顺序的控制流。多线程是指同一个应用程序中,有多个顺序流同时执行,即多线程表示一个程序内部可以同时执行多个线程。多线程的程序能更好地表述和解决现实世界的问题,是计算机应用开发和设计过程的一个必然发展趋势。 1 线程的创建
在Java程序设计中,创建线程有两种方法:一个方法是从一个自定义的类(如Mythread)中创建,即让程序继承Thread类。例如:Thread t=new Mythread();这个类扩展了Java基础类库中的Thread类及其方法。Mythread类中必须替换Thread类中的run()方法。应注意的是,初始化Mythread为类,并不能使对象t作为一个线程开始执行,而必须独立运行的子语句体放到run()方法(是Thread类中的一个方法)中。再调用线程的star()方法来开始线程的执行,进而依顺序调用run()方法。这种创建线程的方法有一个缺陷,即必须扩展Thread类。由于Java是单一继承,不支持多重继承,所以不能写一个多线程的Applet。因为如果写多线程的Applet的话,就要扩展Applet和Thread类,而这在Java中是不允许的。
由于这个原因,Java给出了另一个创建线程的方法。另一种方法是使用接口。在Java中,用于创建线程的接口是Runable,其过程分为三个步骤:(1)声明一个实现Runnable接口;(2)生成一个Thread类的对象;(3)将生成的Runnable对象作为参数传递给Thread构造方法。当线程开始执行时,它将调用执行Runable接口的相应的run()方法。 2 线程的状态
在Java语言中,一个完整的线程周期通常有以下5个状态组成。
龙源期刊网 http://www.qikan.com.cn
2.1 新建状态
新建状态是指一个Thread类或者子类被声明并创建后的状态。新建线程具有相应的内存空间和其他资源,并且已初始化。 2.2 就绪状态
处于新建状态的线程被启动后,将进入线程队列等待CPU时间片,此时它已具备了运行的条件。一旦它来享用CPU的资源时,就脱离创建它的主线程独立开始自己的运行周期。此外,原来处于阻塞状态的线程被解除阻塞后也将进入就绪状态。 2.3 运行状态
当就绪状态的线程被调度并获得CPU资源时,进入运行状态。当线程对象被执行时,它自动调用该对象的run()方法,从第一条语句顺序执行。 2.4 阻塞状态
一个正在被执行的线程在某些特殊情况下(例如,被人为挂起或需要执行输入或者输出操作),让出CPU并暂时终止自己的执行周期,则进入阻塞状态。阻塞时,它不能进入排队队列。只有阻塞的原因被取消,线程才可以转入就绪状态。 3 线程的优先级
Java提供了一个线程调度器来监控程序启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定调度哪个线程来执行。线程调度器是抢先式调度,也就是说在当前线程执行过程中,一个更高优先级的线程进入可运行状态,则这个线程立即被调度执行。Java中线程的优先级从高到低的范围为1~10,Thread类定义了3个常量,用于选择常用的优先
级:MINPRIORITY(其值为1),NORM-PRIORITY(其值为5,默认值)MAX-PRIORITY(其值为10)。当一个线程刚产生时,继承该线程的优先级,通常为5,即NORM-PRIORITY,使用getPriority(),可以得到一个线程的优先级;通过调用setPriority()方法,可以更改一个线程的优先级。Setpriority()方法必须带有一个大于0、小于等于10的整型参数。如果该参数小于1、大于10,则运行时抛出IlegalArgumentExcep-tion。 4 Java多线程技术在手机联网中的应用
MIDlet是一种java程序的执行机制,手机中所有的MIDlet程序都是由Application Manager Software(AMS,应用程序管理软件)管理的。当MIDlet初始化后,AMS就会调用MIDlet的startApp()方法,此时MIDlet就进入了Acitiv状态。在JAVA ME中有些操作可能会导致程序堵塞,比如连接网络等。如果这些操作与主程序在同一个主线程中完成,那么由于堵塞会造成程序
龙源期刊网 http://www.qikan.com.cn
长时间无法返回,也就无法响应用户的其他操作了。所以,如果我们在commandAction()中进行了联网的操作,则会造成如上所述的情况。
例如下面一个“Echo Message”实例,手机端向服务器端发送一条消息,服务器得到此消息后直接返回给手机端。首先,创建一个NetworkConnection类来封装联网相关的操作,这样,MIDlet中只需调用此类中的方法就可以完成联网的操作。接着,我们写一个MalConnectionMidlet类,它继承了MIDlet,在commandAction()方法中直接调用NetworkConnection中的方法,而没有重新创建一个线程。当用户按下“问候”命令时,就会向服务器发送“Hello World”的消息,然后再得到服务器返回的消息,并显示在TextBox中。运行程序。当用户按下“问候”命令后,程序就僵死了,并在Console窗口中得到如下警告。这就是因为没有使用多线程造成的。就来看看如何使用多线程来解决此问题。新建类Network-Thread,它继承在Thread,并将原先commandAction()中发送、接收消息的操作移到此类中完成。此时,在commandAction()中,我们创建了新的线程来完成消息的发送和接收。运行程序,可以成功接受到返回的消息,同样,在移动多媒体的使用过程中也需要应用到多线程。利用手机摄像头拍照的操作也会引起的堵塞,多线程能很好的解决这些问题。 5 结语
在引入Java多线程技术后,首先,程序能够同时执行多个任务,处理不同事件的多线程机制中,不同的线程处理不同的任务,他们之间互不干涉。不会由于一处等待而影响其他部分。其次,它们提供了一个充分利用计算机CPU的方法;再次,它能够提高应用程序的使用率,加快应用程序的响应时间,以及使应用程序更有效地利用系统资源。另外多线程技术不仅用于实时控制编程,它在网络通迅、数学计算和多媒体编程等方面也有着很广阔的应用前景。 参考文献
[1] 阳小兰.Java语言中多线程技术的研究与实现[J].软件导刊,2007. [2] 李卓玲.Java程序设计实用教程[J].大连:大连理工大学出版社,2003.
因篇幅问题不能全部显示,请点此查看更多更全内容