java

位置:IT落伍者 >> java >> 浏览文章

多线程在JAVA ME应用程序中的使用


发布日期:2022年05月06日
 
多线程在JAVA ME应用程序中的使用

多线程技术是JAVA ME中的关键技术应用十分频繁尤其是在游戏中但是对于新手来说又容易忽略或错误的使用多线程导致程序堵塞而无法响应用户的输入请求

由于笔者对于游戏开发不是十分了解所以本文将仅就多线程技术在JAVA ME应用程序中的使用展开讨论本文主要包含如下部分

多线程与联网

多线程与拍照

Timer与TimerTask

多线程与联网

手机中所有的MIDlet程序都是由Application Manager Software(AMS)管理的当MIDlet初始化后AMS就会调用MIDlet的startApp()方法此时MIDlet就进入了Acitive状态在JAVA ME中有些操作可能会导致程序堵塞比如连接网络等如果这些操作与主程序在同一个主线程中完成那么由于堵塞会造成程序长时间无法返回也就无法响应用户的其他操作了所以如果我们在commandAction()中进行了联网的操作则会造成如上所述的情况

下面将通过一个例子来演示如上的情况并使用多线程最终解决此问题这是一个Echo Message实例手机端向服务器端发送一条消息服务器得到此消息后直接返回给手机端

首先创建一个NetworkConnection类来封装联网相关的操作这样MIDlet中只需调用此类中的方法就可以完成联网的操作代码如下


          以下是引用片段

/*

*NetworkConnectionjava

*

*Createdon下午:

*

*/

packagenjunnection;

importjavaioDataInputStream;

importjavaioDataOutputStream;

importjavaioIOException;

importjavaxmicroeditionioConnector;

importjavaxmicroeditionioHttpConnection;

/**

*

*@authorMagic

*/

publicclassNetworkConnection{

privatestaticfinalStringURL=//localhost:/thread/;

privateHttpConnectionhttpConnection;

privateStringmessage;

publicNetworkConnection(Stringmessage){

ssage=message;

connect();

}

/**

*Connecttowebserver

*

*/

publicvoidconnect(){

try{

httpConnection=(HttpConnection)Connectoropen(URL);

(HttpConnectionPOST);

}catch(IOExceptionex){

Systemoutprintln(Cannotopenconnection!);

exprintStackTrace();

}

}

/**

*Sendmessagetoserver

*@throwsjavaioIOException

*/

publicvoidsendMessage()throwsIOException{

DataOutputStreamout=();

outwriteUTF(message);

outclose();

}

/**

*Receivemessagefromserver

*@throwsjavaioIOException

*@return

*/

publicStringreceiveMessage()throwsIOException{

DataInputStreamin=();

Stringmessage=inreadUTF();

inclose();

returnmessage;

}

/**

*Closeconnection

*/

publicvoidclose(){

if(httpConnection!=null){

try{

();

}catch(IOExceptionex){

exprintStackTrace();

}

}

}

}       构造函数的参数是将要被发送的消息服务器端的代码在此不再列出详细请见本文的源代码

接着我们写一个MIDlet调用类中的方法MalConnectionMidlet在commandAction()方法中直接调用NetworkConnection中的方法而没有重新创建一个线程代码如下

          以下是引用片段

/*

*MalConnectionMidletjava

*

*Createdon下午:

*/

packagenjunnection;

importjavaioIOException;

importjavaxmicroeditionmidlet*;

importjavaxmicroeditionlcdui*;

/**

*

*@authorMagic

*@version

*/

publicclassMalConnectionMidletextendsMIDletimplementsCommandListener{

privateDisplaydisplay;

privateTextBoxtext;

privateCommandshowCommand;

publicMalConnectionMidlet(){

display=DisplaygetDisplay(this);

text=newTextBox(Message请使用问候命令发送消息TextFieldANY);

showCommand=newCommand(问候CommandSCREEN);

textaddCommand(showCommand);

textsetCommandListener(this);

}

publicvoidstartApp(){

displaysetCurrent(text);

}

publicvoidpauseApp(){

}

publicvoiddestroyApp(booleanunconditional){

}

publicvoidcommandAction(CommandcommandDisplayabledisplayable){

if(command==showCommand){

/**

*在当前的线程中直接进行联网操作造成程序堵塞

*/

Stringmessage=null;

NetworkConnectionconnection=newNetworkConnection(HelloWorld);

try{

connectionsendMessage();

message=connectionreceiveMessage();

connectionclose();

}catch(IOExceptionex){

exprintStackTrace();

}

textsetString(message);

}

}

}        当用户按下问候命令时就会向服务器发送Hello World的消息然后再得到服务器返回的消息并显示在TextBox中

运行程序如图所示当用户按下问候命令后程序就僵死了并在Console窗口中得到如下警告

          以下是引用片段

Warning:Toavoidpotentialdeadlockoperationsthatmayblocksuchas

networkingshouldbeperformedinadifferentthreadthanthe

commandAction()handler      

这就是因为没有使用多线程造成的下面就来看看如何使用多线程来解决此问题

上一篇:java设计模式之Flyweight(元类)

下一篇:JAVA多线程中的锁机制