android多线程网络通信
2012-04-26 14:37
183 查看
动机:前几天去面试,重点问了一些关于多线程网络通信的问题。这块也的确很重要。特总结一下自己对多线程这块的理解和实现方式。
带着一些问题。。。。。。。
怎么进行网络通信?
网络通信需要注意哪些?
网络连接池怎么来进行实现?
1.怎么进行网络通信?
网络接口+多线程
2. 网络通信需要注意哪些?
稳定+健壮+效率
3. 网络连接池的实现
有自定义实现
也可以使用第三方框架
无论是使用自定义实现还是使用第三方框架都会遇到这些问题。就是网络连接池的基本框架是什么样子的。基本原理是这样的,有一个线程的列表,还有一个报文的列表。报文的列表分为有界的和无界的。这个需要根据需求来定了。 我遇到最多的就是无界的了。 当添加一个报文任务的时候,取得一个空闲的线程来做,当再增加一个报文任务的时候,再取得一条空闲的线程来做。当线程都在忙的时候。在增加报文任务的时候,把这些报文任务添加到报文列表中,当线程有空闲的时候,再来取报文列表中的任务来做。
自定义实现(无界的报文列表):
notify,wait 方法是用的时候,包含这个方法的方法,需要加上同步锁。
例如:
2.同步锁的三种方式
对类进行加锁
例如:
对象锁:
一种是全局对象锁
例如:
一种是局部函数对象锁
例如:
自定义框架代码:
View Code
使用第三方框架实现(无界的报文列表):
//待续。。。。
带着一些问题。。。。。。。
怎么进行网络通信?
网络通信需要注意哪些?
网络连接池怎么来进行实现?
1.怎么进行网络通信?
网络接口+多线程
2. 网络通信需要注意哪些?
稳定+健壮+效率
3. 网络连接池的实现
有自定义实现
也可以使用第三方框架
无论是使用自定义实现还是使用第三方框架都会遇到这些问题。就是网络连接池的基本框架是什么样子的。基本原理是这样的,有一个线程的列表,还有一个报文的列表。报文的列表分为有界的和无界的。这个需要根据需求来定了。 我遇到最多的就是无界的了。 当添加一个报文任务的时候,取得一个空闲的线程来做,当再增加一个报文任务的时候,再取得一条空闲的线程来做。当线程都在忙的时候。在增加报文任务的时候,把这些报文任务添加到报文列表中,当线程有空闲的时候,再来取报文列表中的任务来做。
自定义实现(无界的报文列表):
notify,wait 方法是用的时候,包含这个方法的方法,需要加上同步锁。
例如:
/** * 等待操作 */ private synchronized void httpThreadWait() { try { if(!isRunning()){ wait(); } } catch (InterruptedException e) { System.out.println(e.toString()); } }
2.同步锁的三种方式
对类进行加锁
例如:
/** * 发送数据包 * @param httpPacket 数据包 */ private synchronized static void sendHttpPacket(HttpPacket httpPacket){ //增加数据包到报文列表 HttpThreadPool httpThreadPool = HttpThreadPool.instance(); httpThreadPool.addHttpPacket(httpPacket); //如果有空闲的线程就取得,然后去处理报文 HttpThread httpThread = httpThreadPool.getFreeHttpThread(); if(null != httpThread){ httpThread.setRunning(true); } }
对象锁:
一种是全局对象锁
例如:
/** * 得到最前面的报文 * @return HttpPacket 报文 */ public synchronized HttpPacket getFirstHttpPacket(){ if(isHaveHttpPacket()){ HttpPacket temp = httpPackets.get(0); httpPackets.remove(0); return temp; } else{ return null; } }
一种是局部函数对象锁
例如:
/** * 按键事件同步锁 */ private byte[] keyLock = new byte[0]; /** * 按键按下事件 * * @param keyCode * 键值 * @param event * 事件 * @return 是否响应 */ public boolean onKeyDown(int keyCode, KeyEvent event) { synchronized (keyLock) { if (keyEventList.size() > MAX_EVENT) { keyEventList.remove(0); } keyEventList.add(new KeyAction(KeyAction.KEY_DOWN, keyCode)); } return true; }
自定义框架代码:
View Code
/* * 文 件 名: HttpTest.java * 描 述: <描述> * 修 改 人: 吴佳峻 * 修改时间: 2012-4-24 * 跟踪单号: <跟踪单号> * 修改单号: <修改单号> * 修改内容: <修改内容> */ package thread.pool; public class HttpTest { /** <一句话功能简述> * <功能详细描述> * @param args [参数说明] * * @return void [返回类型说明] * @exception throws [违例类型] [违例说明] * @see [类、类#方法、类#成员] */ public static void main(String[] args) { for(int i=0;i<100;i++){ sendOnePacket(i); } } private static void sendOnePacket(int i) { HttpPacket p1 = new HttpPacket(); p1.setId(i); p1.setUrl("http://www.baidu.com/"); p1.setHandler(new ProductHandler()); sendHttpPacket(p1); } /** * 发送数据包 * @param httpPacket 数据包 */ private synchronized static void sendHttpPacket(HttpPacket httpPacket){ //增加数据包到报文列表 HttpThreadPool httpThreadPool = HttpThreadPool.instance(); httpThreadPool.addHttpPacket(httpPacket); //如果有空闲的线程就取得,然后去处理报文 HttpThread httpThread = httpThreadPool.getFreeHttpThread(); if(null != httpThread){ httpThread.setRunning(true); } } }
使用第三方框架实现(无界的报文列表):
//待续。。。。
相关文章推荐
- Android 网络:基于TCP协议通信,多线程,实现简单的C/S聊天室
- Android移动开发-使用多线程进行网络聊天室通信的实现
- Android 网络通信框架Volley简介(Google IO 2013)
- Android 网络通信框架Volley基本介绍
- android网络通信之消息推送教程实例汇总
- [转]Android的网络与通信
- android网络通信,与socket交换数据
- Java基础知识强化之网络编程笔记23:Android网络通信之 Volley(Google开源网络通信库)
- Android网络通信(4):WebKit
- Android系统回顾(八):网络通信(一)
- Android网络通信框架Volley
- Android网络通信框架Volley的学习笔记
- android中的网络通信(五) 通过web service编程(二) 号码归属地查询
- android应用开发:android网络通信
- android socket网络通信
- Android 网络通信框架Volley简介(Google IO 2013)
- Android网络通信的六种方式
- Android 网络通信框架Volley简介(Google IO 2013)
- android网络通信之WIFI教程实例汇总
- Android作为客户端,PC作为服务端:实现网络通信!