- 浏览: 297742 次
- 性别:
- 来自: 上海
最新评论
-
再_见孙悟空:
写的不错
Dialog -
a549262189:
支持下,正好在学习这块的内容!
Android Gesture Detector -
dcsff:
受教了
LayoutInflater -
庆_啊:
真厉害。
LayoutInflater -
ghj234:
学习了,哈哈
LayoutInflater
先做一个总结:Http连接线程发生阻塞,会影响其他线程也出现阻塞状况 。
修正:这种状况只会出现在emulator中,在真机中一切正常,不会出现" 其他线程也出现阻塞状况 " 。Http连接线程发生阻塞时,HttpConnection对象已在Native中运行,TimerTask线程中的close()也会阻塞,所以如果某个HttpConnection线程阻塞了,你就抛弃这个线程好了(没必要强行interrupt或者close),让它自生自灭,再重开一个线程重新进行连接好了。ps:手机中测试(1)在Form中显示信息;(2)Log。
我认为这是j2me的一个bug。下面是代码:
protected void startApp() throws MIDletStateChangeException { Timer timer = new Timer(); timer.schedule(netTimerTask, 2000); new Thread() { public void run() { try { conn = (HttpConnection) Connector.open("http://10.0.0.172:80", Connector.READ_WRITE, true); conn.setRequestProperty("X-Online-Host", "wap.sina.com"); responseCode = conn.getResponseCode(); if (responseCode == HttpConnection.HTTP_OK) { // LogManager.info("Wap Pass Code = " + responseCode); System.out.println("Wap Pass Code = " + responseCode); } else { // LogManager.info("Wap Fail Code = " + responseCode); System.out.println("Wap Fail Code = " + responseCode); } } catch (IOException e) { try { conn = (HttpConnection) Connector.open("http://wap.sina.com", Connector.READ_WRITE, true); responseCode = conn.getResponseCode(); if (responseCode == HttpConnection.HTTP_OK) { // LogManager.info("Net Pass Code = " + responseCode); System.out.println("Net Pass Code = " + responseCode); } else { // LogManager.info("Net Fail Code = " + responseCode); System.out.println("Net Fail Code = " + responseCode); } } catch (IOException e1) { e1.printStackTrace(); } } finally { // LogFile.writeFile(LogManager.getLogContent()); if (conn != null) { try { conn.close(); } catch (IOException e) { e.printStackTrace(); } conn = null; } } } }.start(); } private class NetTimerTask extends TimerTask { public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { } System.out.println("TimerTask Running"); } // LogManager.info("Disconnected in TimerTask"); // LogFile.writeFile(LogManager.getLogContent()); // if (conn != null) { // try { // conn.close(); // } catch (IOException e) { // e.printStackTrace(); // } // conn = null; // } } }
1. 描述:(1)打开模拟器后,等2s,先让NetTimerTask线程运行起来,然后确认同意网络连接,此时网络连接因为wap的原因发生阻塞,而NetTimerTask线程中的while()循环也跟随发生阻塞,直至21s后,Http连接线程阻塞结束后,NetTimerTask线程中的while()循环才得以继续进行;(2)打开模拟器后,不等NetTimerTask线程运行,即2s之前就确定同意网络连接,此时两个线程全部发生阻塞,直至Http连接线程阻塞结束,两个线程的程序才得以继续进行。
2. 分析
代码是阻塞在http.getResponseCode()这句。此时代码中任何对http的操作都是没用的。因为此时联网线程的控制权已经不在MIDlet中了,而是交给了底层平台的Native Code,因此你对http的任何操作均不起作用 。 也就是说,这段阻塞时间我们是没办法控制的。j2me中像HttpConnection.getResponseCode()之类打开连接的方法是阻塞的,没有异步的办法来关闭这个阻塞。
3. 解决:例如实现一个断点续传
http线程正处在读写过程中调用了Thread.interrupt(),再置线程标志为false,接着关闭is,os,conn。缺点:当is/os还在运行中时,你强制interrupt,此时close()会比较耗时,会造成线程阻塞;已经读写过的东西全部丢失,下一次需要重头开始读写。
解决方法:不要用控制线程启动还是终结的办法去控制你的程序运行还是中止,既然你想在写到一半的时候不写,那为什么又要“整块”写入的方法 ?所以,写的时候同样,一次写一部分,写完这部分,检查是不是还要继续,继续就写下一块,不继续自然就退出循环,退出循环(资源回收等等清理工作做完),没有别的事情要做,线程自然就会退出;
private void load() { 取一块(); while(要不要写下一个 && os.write(块数据,0,块大小)) { 取下一块(); } 清理(); 另:块大小影响写入效率和你可控制的精度,自己取舍,一般为1k; }
因为j2me中如果要Http连接,必须重开一个线程,下面是一个回调设计:
苦力线程 { 获得老板实例; 干活() { while(要不要继续) { } 收拾收拾(); 老板.活干完了(); } 中断干活() { 要不要继续 = false; } } 老板线程 { 苦力; 有项目() { 苦力=new 苦力(); 苦力.start(); //这里之后,老板可以干别的事情了。 //或者你也可以在此之后开启一个进度条,进度条有一个“取消”按钮,按下就掉中断(); } 中断() { 苦力.中断干活(); //这里肯定不会阻塞;虽然苦力线程没有完全退出,但是他不会阻塞老板; } 活干完了() { //在这里等待苦力把活干完。类似于CPU中断; } }
设计思路是:老板要干事情通过开启代理线程进行,老板有一个回调函数;代理(苦力)线程负责干事情,他持有老板的一个引用,当事情成功完成,调老板的回调函数。
注意:中断干活()里面不能有类似http.close()之类的方法,因为这个方法是会阻塞的,也没有必要在老板线程去做http.close(),苦力在做每件事情前检查要不要继续,不要继续就收拾收拾退出;老板只需要告诉苦力,不要继续了,苦力知道不要继续了,他自己会收拾收拾的;苦力线程中的收拾收拾()去做各种close操作,这样不阻塞老板线程;
4. 首次运行时在较短的时间内判断用户的接入方式
打包时默认一个接入方式。第一次连接如果失败,则转换接入方式重新连接。连接成功,将正确的接入方式写入RMS。下次从RMS取接入方式进行连接。这种方法的缺点是,如果默认的接入方式错了,第一次联网验证耗费过多时间。
还有一种做法,就是第一次启动时同时开2条网络线程,分别用两种不同的接入方式。哪个线程先得到网络响应,就用哪个作为正确的接入方式,写入RMS。以后启动时都从RMS获取正确的接入方式。优点:由于2个连接同时进行检查,不存在接入方式设置错误的情况,第一次联网时间会比较短;缺点也很明显,2条联网线程会影响联网速度,并且程序中要做更多的控制和保护。
评论
代码是阻塞在http.getResponseCode()这句。此时代码中任何对http的操作都是没用的。因为此时联网线程的控制权已经不在MIDlet中了,而是交给了底层平台的Native Code,因此你对http的任何操作均不起作用 。 也就是说,这段阻塞时间我们是没办法控制的。j2me中像HttpConnection.getResponseCode()之类打开连接的方法是阻塞的,没有异步的办法来关闭这个阻塞。
也在http.getResponseCode()遇到了阻塞问题,但是对解决方法还没能领悟,先收藏一下。自习研究。谢谢楼主。
发表评论
-
线程过多and高效MIDP编程
2010-05-03 17:42 0见附件 -
XML解析
2010-02-02 23:25 1261下面代码用到了jdom和dom4j两个包 public cl ... -
解压缩
2010-02-02 23:25 1149/* * 非面向对象语言要实现保存工作数据(如一个绘图程序 ... -
回车换行符
2010-01-21 13:52 135011 换行符:另起一行,'\n'10,仅仅把一个长行截断成两 ... -
Thread Pool
2010-01-14 15:27 974public class WorkQueue { p ... -
FileConnection
2010-01-12 15:39 15261. 引言 FileConnection API 是一 ... -
Customized Menu for JavaME
2009-10-10 11:36 1090参考文档: http://www.iteye.com/top ... -
自定义repeat()方法
2009-09-23 17:42 1348j2me的Canvas中有一个repeat()回调方法。大部分 ... -
J2ME移植-键值
2009-09-23 15:07 16481. J2ME标准api中Canvas中定义的键值有17(方向 ... -
kxml doc
2009-09-22 14:55 18881. KXmlParser java.lang.Ob ... -
jar和jad解释
2009-08-20 23:22 1246整理电脑,从F盘挖坟挖出的股东,也贴出来吧 如果是K- ... -
图片在程序内存中的占有量
2009-08-20 17:58 27091. 图片占内存容量计算公式为: 图片所占内存大小 ... -
如何从网络中获取png图片
2009-08-03 19:54 20311. J2ME // 方法1 Connector conn ... -
cmnet和cmwap的访问
2009-07-30 11:06 2359CMWAP(通过WAP网关代理,由WAP网关连接服务器,然后将 ... -
JSR75 FileConnection Optional Package 使用方法
2009-07-29 17:09 1634package forrest.fcop; imp ... -
mobile日志
2009-07-29 16:05 9791.项目中的实际应用 这个demo用到了JSR75 - ... -
DoubleBuffer 实现
2009-07-29 10:22 1283绘制地图的时候会出现图片断裂,屏幕闪烁等绘图效率问题 ... -
System.getProperty(String key)和MIDlet.getAppProperty(String key)
2009-07-13 17:53 19991. System.getProperty(String ... -
WTK的安全特性
2009-07-01 17:28 10831. MIDlet套件签名的背景 ... -
纳米星开发遇到的一些bug
2009-06-30 17:01 10541.Stream和Connection使用后要关闭 ...
相关推荐
"libevent 多线程 HTTP post服务器" 指的是一种使用libevent库构建的、支持多线程处理HTTP POST请求的服务器。libevent是一个事件通知库,它提供了一种方法来执行非阻塞I/O操作,这对于高性能网络服务器尤其重要。而...
通过分析和运行这个示例,我们可以学习如何在实际开发中创建多线程HTTP服务器。通常,这样的服务器会包含以下关键组件: 1. **监听模块**:用于监听指定端口的连接请求。 2. **线程池**:管理服务器创建的线程,...
4. **网络故障排查**:在网络连接问题中,分析器能帮助定位问题源头,如网络延迟、阻塞或服务器错误。 **VC++实现HTTP协议分析器** 在VC++环境中开发HTTP协议分析器,主要涉及以下技术: 1. **套接字编程**:使用...
在多线程HTTP服务器中,通常每个连接会由一个独立的线程处理,这样可以避免一个慢速请求阻塞其他请求的处理。`countc.c`可能包含了计数器或者并发控制的实现,用于跟踪当前服务器正在处理的连接数量。 项目中的`....
非阻塞的HTTP服务器是一种高效的网络编程模型,它利用了Java NIO(Non-blocking Input...通过对这些源码的分析和学习,开发者能够深入理解非阻塞HTTP服务器的工作原理,并能以此为基础开发出更高效、更健壮的网络服务。
总结来说,"使用阻塞模式、完成端口的多线程socket iocp"是一种通过IOCP实现的高效Socket服务器模型,它结合了阻塞模式的简单性和非阻塞模式的效率,利用多线程并发处理多个连接,适用于大规模、高并发的网络服务。...
学习和分析这个项目,可以深入了解网络编程的基本原理,多线程同步机制,以及HTTP协议的工作方式。同时,通过实践还可以提升Linux系统编程和调试技能,对于想要深入理解服务器后台运作机制的开发者来说,这是一个...
3.2.2. ThreadDump:用于生成Java线程快照,分析线程状态,识别死锁和线程阻塞问题。 3.2.3. JProfiler:功能强大的全栈性能分析工具,包括CPU、内存、线程、数据库等多方面的监控和分析。 3.2.4. JCA401:Java通信...
本文将重点分析gRPC的线程模型,并对比传统的BIO和NIO线程模型。 1. **BIO线程模型**: 在Java的早期版本中,BIO(Blocking I/O)是默认的I/O模型。在BIO模型中,每一个客户端请求都会创建一个新的线程进行处理,...
3. **多线程与异步处理**:Android中的AsyncTask、Handler、Looper、ThreadPool等工具,用于解决UI线程阻塞问题。分析这些组件的源码,有助于理解线程间的通信和任务调度。 4. **数据存储**:SQLite数据库、...
分析和理解这段源码,对于理解Java NIO和非阻塞Http服务器的工作原理非常有帮助。 总的来说,Java实现的非阻塞Http服务器利用了Java NIO的优势,实现了高效的并发处理能力,适用于需要处理大量并发连接的Web服务。...
- HashMap与TreeMap:分析它们的内部实现和性能特性,以及线程安全问题。 - HashSet与LinkedHashSet:理解它们的区别,特别是有序性和唯一性。 3. **多线程**: - 线程的创建:通过Thread类和Runnable接口创建...
同步竞争则关乎多线程环境中的效率,过多的同步可能导致线程阻塞,影响服务器处理能力。使用性能分析工具(如JVisualVM或JProfiler)可以帮助识别和解决这些问题。 性能分析的关键在于数据收集和跟踪。在高负载下,...
在MFC中,我们可以创建和管理线程来执行后台任务,例如网络下载,而不会阻塞用户界面的正常响应。 二、MFC中的线程类 MFC提供了`CWinThread`类作为线程的基础。要创建一个新的线程,我们需要从`CWinThread`派生一个...
4. **异步编程**:`async/await`关键字是C#中实现异步操作的重要手段,它能避免线程阻塞,提高程序响应性。在数据抓取过程中,可能用到了异步HTTP请求和异步文件读写,确保主线程不被长时间占用。 5. **错误处理与...
ASP.NET多线程是.NET框架下进行并发编程的重要技术,尤其...通过分析和实践"ASP.NET多线程源码"中的示例,开发者可以深入了解这些概念,提升在ASP.NET环境下的多线程编程技能,为构建高效、稳定的Web应用打下坚实基础。
- **分析思路**:分析线程数量及调用堆栈,判断是否存在异常线程或长时间阻塞的情况。 - **分析案例**:金汉斯项目中,通过ThreadDump发现大量线程处于等待状态,进一步分析发现是由于某些补丁导致的问题。 此外,...
多线程确保了系统的高效性和响应性,避免了因为单一线程阻塞而导致的服务中断。 具体实现上,服务器端可能会创建一个聊天服务对象,该对象实现特定的接口,使得客户端可以通过Remoting进行调用。服务器还需要监听...
通过创建Thread对象或者使用ThreadPool,可以在后台处理多个HTTP请求,避免阻塞主线程。 6. **错误处理**:在处理网络请求和解析过程中,可能会遇到各种异常,如网络连接问题、服务器错误等。因此,良好的错误处理...
6. **多线程编程**:为了确保用户界面的响应速度,数据获取和处理可能需要在后台线程进行,避免阻塞主线程。VB支持多线程编程,需要理解线程同步和互斥的概念,防止数据竞争问题。 7. **数据库存储**:历史股票数据...