`
mfcai
  • 浏览: 409141 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用线程创建的三种方式实现j2me联网功能

阅读更多
在j2me联网时,在eclipse控制台下有一个警告:“若要避免潜在的死锁,应该在commandAction()处理程序之外的其他线程中执行可能会阻塞的,操作(如网络连接)。
为了避免潜在的死锁,我们经常把把联网的代码部分写到一个线程中去执行。
而实际应用中,网络连接的事务也都是使用一个单独的线程进行的。

线程的创建可以使用Runnable接口来实现,也可以使用Thread类实现,还可以以匿名内部类的方式创建。在本文中,分别用这三种方式给出了j2me联网的例子。
代码均测试通过。可以直接使用。
1.通过继承Thread类创建
/** 
* 测试Thread类线程 
* @author mfcai 
*/ 
  import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class OpenConn implements Runnable {
	private HttpURLConnection conn;
	private URL url;

	// Thread thread1;

	public OpenConn(String url) throws MalformedURLException {
		this.url = new URL(url);
	}

	public void run() {
		try {
			conn = (HttpURLConnection) url.openConnection();
		} catch (IOException e) {
			e.printStackTrace();
			url = null;
		}
	}

	public HttpURLConnection getConn() {
		return conn;
	}

	public static void main(String[] args) throws Exception {
		// 创建Runnable类
		OpenConn openConn = new OpenConn("http://www.google.com");
		// 创建线程
		Thread thread = new Thread(openConn);
		// openConn.thread1=thread;
		thread.start();
		thread.join(10000);// wait 10 seconds
		HttpURLConnection c = openConn.getConn();
		if (c != null) {
			System.out.println("连接网络成功...");
			BufferedReader r = new BufferedReader(new InputStreamReader(c
					.getInputStream()));
			String s = r.readLine();
			while (s != null) {
				System.out.println(s);
				s = r.readLine();
			}
		} else {
			System.out.println("超时错误,连接网络失败...");
		}
	}
}
 
2.通过引用Runnable接口创建
/** 
* 测试Runnable接口线程 
* @author mfcai 
*/ 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class OpenConn2 extends Thread {
	private HttpURLConnection conn;
	private URL url;

	public OpenConn2(String url) throws MalformedURLException {
		this.url = new URL(url);
	}

	public void run() {
		try {
			conn = (HttpURLConnection) url.openConnection();
		} catch (IOException e) {
			e.printStackTrace();
			url = null;
		}
	}

	public HttpURLConnection getConn() {
		return conn;
	}

	public static void main(String[] args) throws Exception {
		OpenConn2 openConn = new OpenConn2("http://www.google.com");
		openConn.start();
		openConn.join(10000);// wait 10 seconds
		HttpURLConnection c = openConn.getConn();
		if (c != null) {
			System.out.println("连接网络成功...");
			BufferedReader r = new BufferedReader(new InputStreamReader(c
					.getInputStream()));
			String s = r.readLine();
			while (s != null) {
				System.out.println(s);
				s = r.readLine();
			}
		} else {
			System.out.println("超时错误,连接网络失败...");
		}
	}
}

3.以匿名内部类的方式创建
即在一个方法中创建线程,当方法被调用时,线程即启动,如下:
/** 
* 测试匿名线程线程创建 
* @author mfcai 
*/ 


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class OpenConn3 {
	private HttpURLConnection conn;
	private URL url;
	
	public static void main(String[] args){
		try{
			OpenConn3 open3= new OpenConn3();
			open3.strartMyThread();
		}catch(Exception ex){
			System.out.println(ex.toString());
		}
	}
	 public void strartMyThread() throws Exception{ 
		 this.url =new URL("http://www.google.com");
         java.lang.Runnable runner=new Runnable(){
        	 public void run(){ 
        		 try {
        				conn = (HttpURLConnection) url.openConnection();
        			} catch (IOException e) {
        				e.printStackTrace();
        				url = null;
        			}
        	 }

         };
         Thread openConn=new Thread(runner); 
         openConn.start(); 
         openConn.join(10000);// wait 10 seconds

 		if (conn != null) {
 			System.out.println("连接网络成功...");
 			BufferedReader r = new BufferedReader(new InputStreamReader(conn
 					.getInputStream()));
 			String s = r.readLine();
 			while (s != null) {
 				System.out.println(s);
 				s = r.readLine();
 			}
 		} else {
 			System.out.println("超时错误,连接网络失败...");
 		}

	 }
}


转载请注明作者和出处。

分享到:
评论
2 楼 wkklun 2010-01-28  
很好的代码,线程的三种实现方式都实现了
1 楼 hemin108 2009-07-06  
呵呵 的确遇到过这类问题,谢谢分享
另外想问下 怎么实现联网后取得返回的信息呢,例如我做个手机归属地查询,怎么取得返回的归属地信息?

相关推荐

    J2ME通用进度条,解决联网、线程操作等候问题

    在J2ME中,我们通常使用` javax.microedition.lcdui.ProgressIndicator`接口来实现进度条功能。 实现J2ME进度条通常涉及以下步骤: 1. **创建进度条**:首先,你需要创建一个`ProgressIndicator`实例。可以使用`...

    J2ME开发入门(新)

    这包括减少内存占用、优化代码执行速度以及合理使用线程。 **10. 安全性** J2ME应用的安全性受到限制,例如不能访问设备的某些敏感功能,这是为了保护用户的隐私和设备安全。开发者需要了解并遵循这些安全策略。 ...

    j2me手机基于服务器的网络象棋游戏源代码

    【J2ME手机基于服务器的网络象棋游戏源代码】是一种专门为移动设备设计的网络棋类游戏实现,它利用Java 2 Micro Edition (J2ME) 技术,让玩家能够在手机上与其他在线用户对战。J2ME是Java平台的一个轻量级版本,主要...

    J2ME游戏开发(中文译本)

    7. **网络编程**:J2ME支持联网功能,书中有章节讲述如何实现在线对战、数据同步和更新等网络特性。 8. **性能优化**:由于移动设备硬件限制,性能优化是J2ME游戏开发的关键。书中会给出如何减少内存消耗、提高代码...

    基于j2me的坦克大战源码

    8. **网络功能**:虽然坦克大战可能不需要网络功能,但J2ME支持联网,如果源码包含这部分,可能涉及多人在线对战或排行榜的实现。 9. **优化与性能**:J2ME设备的性能有限,所以源码需要考虑内存和CPU使用效率,...

    J2ME弱联网

    - J2ME中的弱联网实现往往依赖于特定的库,如KVM(K Java Virtual Machine)提供的内置网络API,或者第三方库如Nokia的JSR 82 API(蓝牙连接)或M3GAP(多媒体消息服务)等,它们可以帮助开发者更容易地处理网络...

    J2me 手机游戏例子

    使用J2ME的Graphics类可以创建各种形状、颜色和文本,实现游戏元素的渲染。为了制作动画,开发者需要掌握如何利用定时器和缓存策略来平滑地过渡帧。 5. **事件处理** J2ME提供了键盘和触摸屏事件处理机制,使得...

    J2ME题库综合.rar

    例如,KVM(K Virtual Machine)是J2ME的一种轻量级虚拟机,用于实现配置,而Mobile Information Device Profile(MIDP)则提供了在移动设备上开发应用程序的框架。 **MIDP和CLDC** MIDP(Mobile Information ...

    J2ME_7_skills.rar_j2me

    通过深入学习和实践这七大技能,你将能够创建出功能完备、运行流畅的J2ME应用程序。同时,不断关注J2ME的更新和发展,如新的Profile和Configuration,将有助于保持技术的前沿性。在学习过程中,参考“J2ME_7_skills....

    j2me手机高级编程

    4. **Chapter 5(ch5):用户界面**:J2ME的用户界面设计可能在这章中进行讲解,包括使用MIDP的Canvas和Form类创建自定义UI,以及如何处理用户输入事件。可能还会介绍如何使用LWUIT( Lightweight User Interface ...

    J2ME手机游戏案例精编

    5. **网络功能**:J2ME支持联网功能,使得多人在线游戏成为可能。书中可能包含如何使用MIDP的HttpConnection或SocketConnection进行数据传输的内容。 6. **数据持久化**:为了保存游戏进度,开发者需要了解如何利用...

    J2ME开发大全J2ME开发大全

    J2ME应用的数据存储主要依赖于Record Management System (RMS),这是一种简单的键值对存储方式。RMS允许应用在本地设备上保存数据,即使在无网络连接的情况下也能正常工作。 **6. 源代码管理** 压缩包中的"j2me...

    J2ME编程源代码(书中代码)

    - 在J2ME中,多线程是实现并行操作的关键,比如游戏的动画和用户交互可以分别在不同的线程中运行。 7. **性能优化** - 由于J2ME的目标设备通常资源有限,因此代码优化是必要的。例如,避免不必要的对象创建,使用...

    j2me的炸潜艇游戏

    5. **网络功能**:虽然"j2me的炸潜艇游戏"可能不涉及网络功能,但J2ME允许开发者添加联网特性,如在线排行榜、多人对战等,这会大大增加游戏的可玩性。 **文件结构分析** 在压缩包文件名称列表中,只有一个文件名...

    j2me网络编程以及网络游戏的实现.doc

    通过以上步骤,开发者可以构建一个基础的网络环境,进而开发具有联网功能的J2ME游戏。这些游戏可以允许玩家在线对战、交换游戏物品,或者同步游戏进度,极大地增强了游戏的可玩性和互动性。随着移动网络技术的不断...

    哈工大J2ME课件(新)2008届

    9. **多线程介绍**:在J2ME中,多线程是实现并发操作的关键。学习者将学习如何创建和管理线程,以确保应用程序的响应性和效率。 10. **Message开发**:这部分可能涉及到J2ME的Messaging API,学习者将学习如何发送...

    J2ME 应用开发案例 比较实用的几个手机小程序

    案例可能涵盖如何使用Connector类发送HTTP请求,获取网页内容,或与服务器进行数据交换,这对于实现联网功能的应用如天气查询、新闻浏览等很有帮助。 4. **多媒体处理**:J2ME提供了JSR-135(Java Bindings for the...

    J2ME五子棋完整代码

    3. **多线程编程**:为了实现流畅的游戏体验,可能需要使用多线程来分离用户交互与游戏逻辑的执行,保证用户操作的即时反馈。 4. **网络通信**:J2ME提供了JSR-82(Java Bluetooth API)和JSR-118(Java Wireless ...

Global site tag (gtag.js) - Google Analytics