您的位置:首页 > 理论基础 > 计算机网络

android多线程网络通信

2012-04-26 14:37 183 查看
动机:前几天去面试,重点问了一些关于多线程网络通信的问题。这块也的确很重要。特总结一下自己对多线程这块的理解和实现方式。

带着一些问题。。。。。。。

怎么进行网络通信?

网络通信需要注意哪些?

网络连接池怎么来进行实现?

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);
}
}
}


使用第三方框架实现(无界的报文列表):

//待续。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: