怎么才能让winhttp 多线程的这个在多线程中可以应用

& 相关文章 &
WinHTTP如何处理Cookie
WinHTTP如何处理Cookie HTTP session data is passed between the client and server in the cookie header of the request or the response. The server sends cookies to the client in the Set-cookie header of the response and the WinHTTP API resends the server
Cookie Handling in WinHTTP
The WinHTTP API has different cookie handling behaviors for versions of the operating system earlier than Windows XP SP2 and Windows Server 2003 SP1: Windows XP SP2 and later, and Windows Server 2003 SP1 and later: The WinHTTP API clears all cookies sent
WinINet 与 WinHTTP简介
也可以用于系统服务以及基于HTTP的客户端应用,但是对于那种需要使用到FTP协议,cookie保存,缓存cache,自动证书对话框处理,IE兼容,或者下载平台支持的应用则应该使用WinINet。
另外,从windows8开始,WinHTTP为WebSocket协议增加了新的接口实现,比如WinHttpWebSocketSend 和 WinHttpWebSocketReceive这类。
更多的了解可以看官方的这篇文章, About WinHTTP
WinHTTP中的身份认证
WinHTTP中的身份认证 Microsoft Windows HTTP Services (WinHTTP) fully support the client side use of the Microsoft Passport authentication protocol. This topic provides an overview of the transactions involved in Passport authentication and how to handle
我们在windows平台上写一些WEB机器人程序的时候,通常有三种方法。 1.webbrowser 一种是使用webbrowser控件加载网页,用MSHTML来操控整个网页,进行模拟填表、提交、点击、采集数据。这种方式开发起来比较简单。但由于需要加载整个页面,缺点是速度慢、效率不高,内存占用大,难以做成多线程并发。 2.Winhttp 一种是直接基于HTTP协议来做,分析出每一个填表、提交、点击的背后,都进行了什么GET/POST动作,使用Winet或Winhttp进行模拟相应的GET
我们在windows平台上写一些WEB机器人程序的时候,通常有三种方法。 1.webbrowser 一种是使用webbrowser控件加载网页,用MSHTML来操控整个网页,进行模拟填表、提交、点击、采集数据。这种方式开发起来比较简单。但由于需要加载整个页面,缺点是速度慢、效率不高,内存占用大,难以做成多线程并发。 2.Winhttp 一种是直接基于HTTP协议来做,分析出每一个填表、提交、点击的背后,都进行了什么GET/POST动作,使用Winet或Winhttp进行模拟相应的GET
我们在windows平台上写一些WEB机器人程序的时候,通常有三种方法。 1.webbrowser 一种是使用webbrowser控件加载网页,用MSHTML来操控整个网页,进行模拟填表、提交、点击、采集数据。这种方式开发起来比较简单。但由于需要加载整个页面,缺点是速度慢、效率不高,内存占用大,难以做成多线程并发。 2.Winhttp 一种是直接基于HTTP协议来做,分析出每一个填表、提交、点击的背后,都进行了什么GET/POST动作,使用Winet或Winhttp进行模拟相应的GET
WinHTTP的AutoProxy常见问题
file resides has been compromised, it is possible the PAC script code is malicious. Therefore, WinHTTP uses the following precautions to protect the client: 处理代理自动配置文件需要下载执行脚本代码。这就带来一些安全问题:如果存有PAC文件的服务器沦陷掉了,那么PAC代码就有可能被变成恶意代码。因此,WinHTTP使用下列注意事项来保护客户端安全
WinInet 与 winHTTP 共同引用 冲突
WinInet 与 WinHTTP 同为Windows 平台下访问互联网的API组。WinInet 技术比较老,已经有十余年历史了,在某些方面并不完全胜任访问Internet的工作。于是后来有了winHTTP APIs。 或许是微软考虑到winHTTP技术可以全面替代WinInet访问,所以某些结构体、宏被winHTTP.h 文件进行了重定义。当一个代码文件(.cpp 或.inl) 同时包含WinInet.h 和 winHTTP.h 文件时,将引起编译错误。 转载地址,下载链接:/michaellee/archive//1555131.html
Windows 8上手動設定proxy
在舊電腦上裝windows 8卻發現沒有網路選項可以設定proxy,上網找了Microsoft的網站,發現了底下這一個網頁說明,不過只是一個大概,只好自己try and error。 /kb/2777643/zh-tw 1. 使用administrator的權限,打開命令提示字元,也就是所謂的dos command mode。 2. 使用 netsh winhttp這一個指令來做設定。 3. 可以輸入 netsh winhttp,會給你相
Requirements 要求
最低支持的客户端 Windows XP, Windows 2000 Professional with SP3 Windows XP
最低支持的服务器 Windows Server 2003, Windows 2000 Server with SP3
可再发行 WinHTTP 5.0 and Internet Explorer 5.01 or later on Windows XP and Windows 2000.
WinHTTP的5.0
WinHTTP 自动代理支持
with WinHTTP version 5.1 in Windows 2000 Service Pack 3, Windows XP Service Pack 1 and Windows Server 2003. Note that although both Microsoft Internet Explorer and Microsoft WinHTTP support WPAD, the specification never progressed beyond the "Internet-Draft
Using WinHTTP as a Side-by-side Assembly
Using WinHTTP as a Side-by-side Assembly On Windows Server 2003, WinHTTP is implemented as a side-by-side assembly, and must be linked to as such. Note that this does not apply to Windows Vista and later. Side-by-side Assemblies Starting
VB6: 在客户端中使用WinHttp组件,发送Https请求
现在越来越多的网站使用了Https来进行数据加密, 在VB6客户端中如何访问这些内容? 使用WinHttp组件里的WinHttpRequest对象可以解决我们的问题。 1、引用“Microsoft WinHTTP Services, version 5.1”组件 2、下面是源代码 ''使用WinHttp组件,发送Https请求
C:\WINDOWS\system32\WINHTTP.dll
Microsoft WinHTTP Services, version 5.1
什么是WinHTTP?
WinHTTP的全称是Microsoft Windows HTTP Services, 它提供给开发者一个HTTP客户端应用程序接口(API), 通过这种API借助HTTP协议给其他的HTTP服务器发送请求.
WinHTTP支持桌面应用程序, Windows系统服务, 和Windows服务器端应用程序. 对于基于Microsoft .NET Framework的应用程序, 不推荐使用WinHTTP服务, 因为.NET Framework应用程序应该使用在System.Net命名空间下的网络
目录 1。背景 2。概述 3。WebKit 4.渲染器 5。浏览器 6.Cookies 背景 所有网络通信由主浏览器进程处理。这样做不仅使浏览器进程可以控制每个渲染器的访问网络,而且这样还使我们能保持如Cookies和缓存的数据等对话的数据贯穿所有的进程中。这一点很重要,这是因为,作为一个HTTP/1.1中用户端,一个浏览器不能对一个站点打开过多的连接。 在Windows上,我们目前使用的WinHTTP。在未来,我们计划用自定义HTTP以取代实现这一点。与WinInet相比的(我们有一个传统
Messenger 2011软件虽然在用户界面上可以手动设置代理服务器,但事实上,MSN并没有完全使用到web代理登陆(只有一部分登陆过程用到web代理)。 c | MVk
解决方法 u /Z{4"P
===== %w]Jt3 
我们发现MSN Live Messenger 2011只能通过调用了操作系统的winhttp代理来使用web代理 e_4 2 LH@
进行登录。Windows系统中winhttp代理默认是空的,它和IE代理是完全独立的两套代理,所以无论
Messenger 2011软件虽然在用户界面上可以手动设置代理服务器,但事实上,MSN并没有完全使用到web代理登陆(只有一部分登陆过程用到web代理)。 c | MVk
解决方法 u /Z{4"P
===== %w]Jt3 
我们发现MSN Live Messenger 2011只能通过调用了操作系统的winhttp代理来使用web代理 e_4 2 LH@
进行登录。Windows系统中winhttp代理默认是空的,它和IE代理是完全独立的两套代理,所以无论
在WinHTTP中使用SSL
certificates to send to HTTPS servers. WinHTTP为使用SSL提供了高层接口。这样SSL握手交换在内部得以处理。WinHTTP使你获取加密等级,设置加密协议,操作服务器和客户端证书。下面章节讲述了基于WinHTTP如何创建SSL协议,测试服务器证书,选择客户端证书发送到HTTPS服务器。 Server Certificates 服务器证书 Server certificates are sent from the server to the client so
windows上的网络基础库
Windows平台程序也都开始依赖于此库。 (3)WinInet,Windows Internet扩展库,工作于应用协议层,提供了http,ftp,gopher协议的实现,为基于以上三种协议的程序开发提供基础平台,需要说明的是,尽管WinInet工作于应用层,但其本身wininet.dll的实现并不依赖于winsock.dll或ws2_32.dll,而是独立存在的。至少目前的版本是这样。基于WinInet的应用程序最著名的例子就是IE了。 (4)WinHttp,也是工作于应用协议层,提供
& 2012 - 2016 &
&All Rights Reserved. &
/*爱悠闲图+*/
var cpro_id = "u1888441";在winHttp中使用同步与异步。。。
阅读权限20
在线时间 小时
本帖已被收录到知识树中,索引项:
vba 不是单线程吗,异步能实现多线程么?
阅读权限100
在线时间 小时
设置成1000的,动画效果如下,当然可以将数据放到数组也是可以
我设成2000测试,Excel停止响应了。
阅读权限30
在线时间 小时
我的意思是说,你得提供一个能够正确运行的代码,这样我才能放入知识树。
你目前的代码需要修改。
老师也可以把你的代码共享一下呗。
阅读权限30
在线时间 小时
设置成1000的,动画效果如下,当然可以将数据放到数组也是可以
异步.gif (1.13 MB, 下载次数: 76)
14:20 上传
14:21 上传
点击文件名下载附件
26.39 KB, 下载次数: 272
阅读权限100
在线时间 小时
& & & & & & & &
本帖最后由 liucqa 于
14:08 编辑
老师也看出来了,其实我一般不会去操作excel,输出只是在最后一步,我这样演示只是为了让大家更方便的看 ...
我的意思是说,你得提供一个能够正确运行的代码,这样我才能放入知识树。
你目前的代码需要修改。
你把func.xla关掉,再把m调整到2000,看看你代码运行情况就知道了。
其他的交互、错误处理之类的功能,能提供当然更好,不能提供也不影响放入知识树。
最后,还是要对你这种乐意分享,无私奉献的精神表示感谢!
阅读权限30
在线时间 小时
& && &Do
BeginRequest
retryTimes = retryTimes + 1
Loop Until retryTimes & 10复制代码
嗯,其实就在On_Error中加上这一句就好了,重试次数不一定非得过多,关键一点是需要控制他的并发量,这个也可以用代码来实现的,就比如是1W次的并发,这样的量就算以你的最大网速来下载也会需要不少时间吧,再说并发运行的时间,就相当是你的重复次数*默认的超时时间内需要完成,但以大家的网速,在这么短的时间根本达不到这样的下载量,所以还是会有不少数据会丢失的。
这种并发的后期处理就看大家怎么用了,用得好当然乐,没用好的话也无需悲观,大不了,待程序运行完了,再根据针对超时的页面再次并发就好了
阅读权限30
在线时间 小时
如果有可能的话,看看能否将代码修改完整。
采用winhttp异步并发采集网页,需要处理许多问题,所以一 ...
老师也看出来了,其实我一般不会去操作excel,输出只是在最后一步,我这样演示只是为了让大家更方便的看出异步的效果而已,兼顾看顺序和速度而已。我的代码和func.xla是无任何关系的,那里面只是存放了一些我常用的代码以及为了引用某些dll方便点。至于启动异步、回调结束的进度提示,这个其实是一件很简单的事,顶多就相当于Interlocked.Increase的功能而已引用老师的一句叫,指路而无暇爬山,当然我说过,老师也可以将自己比较成熟的案例共享一下供大家学习学习呗。。
阅读权限100
在线时间 小时
本帖最后由 liucqa 于
13:14 编辑
可能大家对第二种方式很感兴趣,速度在那儿放着的,但往往是这一点,需要特别注意的是,如果一次性并发过大 ...
如果有可能的话,看看能否将代码修改完整。
采用winhttp异步并发采集网页,需要处理许多问题,所以一个简单的类是无法达成异步期望的效果的。
大概你给出的异步代码依赖func.xla,而且没怎么测试吧,运行起来频频报错,那个窗体进度条是无效的。把m改成2000或者10000测试看看...反正我的Excel是报错停止工作了
一个完整的异步代码,至少应该提供启动异步、回调结束的进度提示,以便使用者能够判断是不是程序执行结束了,这需要类模块与主模块之间做交互,在异步回调结束之前,主模块是不能结束运行的。
需要注意的是,在Excel运行的时候,vba同时操作两个cells会导致Excel报错,而大量做异步并发的时候,这种情况发生的概率挺大,需要对代码做优化以降低概率,或者提供错误处理的代码。当然,最好的办法是别用vba搞并发操作Excel,呵呵!
最后,还是要对你的学习精神表示支持,论坛像你这样的会员越来越少了
阅读权限30
在线时间 小时
可能大家对第二种方式很感兴趣,速度在那儿放着的,但往往是这一点,需要特别注意的是,如果一次性并发过大的话,很容易造成不必要的数据丢失,就好比你的打算下一部电影,但你的网速在那儿限制着,没办法一次性下载完成,所以不可能在winHttp默认的超时时间内完成所需要的数据。
换句话说,这个取决于自身的网速限制以及电脑自身的性能,如果是超时的话,可以在winHttp_OnError的事件进行重新发报。。最后。采用异步的话在Post发报的时候与正常的同步在书写过程还有一定的差异,因为在同步中cookie或报文都是存在于同一个对象中,但是异步的Post中,却不会存在于同一个对象中,所以winHttp的异步发送方式中需要自己去模拟cookie等报文。。具体如何模拟就不细说了。。呵呵,大致完工。如果其中有啥歧义或者有误的地方,可以提出来,个人也只是分享自己的一点心得而已。呵呵。。
阅读权限30
在线时间 小时
本帖最后由 浮华、缠绕指尖 于
08:40 编辑
二、回调,无需等待。
异步.gif (38.85 KB, 下载次数: 16)
08:39 上传
注意到其的下载顺序与速度。
(28.17 KB, 下载次数: 252)
08:39 上传
点击文件名下载附件
您需要登录后才可以回帖
最新热点 /1
ExcelHome每周都有线上直播公开课,
国内一流讲师真身分享,高手贴身答疑,
赶不上直播还能看录像,
关键居然是免费的!
厚木哥们都已经这么努力了,
你还好意思说学不好Office。
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师请完成以下验证码
查看: 16916|回复: 12
怎么才能让IDM满线程下载
首先软件设置中已将最大连接数设定为16(最大)见图 右上角
17-56-06.jpg (13.8 KB, 下载次数: 10)
17:59 上传
但是每每下载文件的时候却只能使用9个线程而不是16个 见图
17-53-12.jpg (23.38 KB, 下载次数: 5)
18:01 上传
请问怎么才能让下载时使用16个线程呢 谢谢。。。。
这个应该是源文件的线程多少来决定的吧、
你好 其实我也考虑过这个问题 但是 我用该软件下载了好些资料都是只能使用9个线程 不论什么样的资源都是这样 这个就太费解了
陈品名 发表于
回复 2楼 xiaoyongdk 的帖子
你好 其实我也考虑过这个问题 但是 我用该软件下载了好些资料都是只能使用9个 ...
这个我也不清楚、或许也跟带宽的大小有关吧
IllusionWing
IDM的线程默认是由程序自行决定的,是根据网络带宽和文件本身作出的优化。其实线程多了不见得好。另外有的FTP服务器限制线程的。
恩 不管怎么样还是谢谢你的答复
恩 明白了 今后不再刻意追求线程了&&谢谢你&&
需要服务器支持,一般没服务器会开那么多线程让你下
想问问你们在使用这个软件下载东西的时候和我一样也不能满线程对吧 谢谢
服务器限制
Copyright & KaFan & All Rights Reserved.
Powered by Discuz! X3.3( 苏ICP备号 ) GMT+8,查看: 2352|回复: 6
多线程调用WinHttp.WinHttpRequest.5.1
阅读权限50
结帖率: (39/39)
下面这个能写成个子程序放在在窗口程序集里给窗口的多线程调用么?谢谢
& && && && && & CoInitialize (0)
& && && && && & WinHttp1.创建 (“WinHttp.WinHttpRequest.5.1”, )
& && && && && & WinHttp1.方法 (“Open”, “GET”, “/modules.php?m=surfer&show=captcha”, 假, )
& && && && && & WinHttp1.写属性 (“Option”, 6, 0)
& && && && && & CoUninitialize ()
子程序都用局部变量
回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至
可获得加分喔。友情提醒:本版被采纳的主题可在
帖子申请荣誉值,获得 1点 荣誉值,荣誉值可兑换终身vip用户组哦。快捷通道: →
阅读权限165
签到天数: 4 天结帖率: (11/11)
可以的&&子程序都用局部变量
热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!
您可以选择打赏方式支持他
阅读权限130
签到天数: 19 天结帖率: (28/50)
貌似 WinHttp 在线程中会失效,我上次搞过
您可以选择打赏方式支持他
阅读权限50
结帖率: (39/39)
貌似 WinHttp 在线程中会失效,我上次搞过
单个线程我搞过完全没问题。
您可以选择打赏方式支持他
阅读权限130
签到天数: 19 天结帖率: (28/50)
单个线程我搞过完全没问题。
是的,多线程会出现无效情况,不知道是咋回事
您可以选择打赏方式支持他
阅读权限165
可以放在子程序里执行的
winhttp完美支持多线程,我一直在用的
您可以选择打赏方式支持他
阅读权限50
结帖率: (39/39)
继续求助.......
您可以选择打赏方式支持他
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
防范网络诈骗,远离网络犯罪
违法和不良信息举报电话,企业QQ: ,邮箱:@
Powered by
粤公网安备 25java多线程小结,及解决应用挂死的问题 - 女儿3岁了还是要继续钻研技术 - ITeye博客
博客分类:
这两天为了定位JBOSS老是挂死的问题,学习了一下JAVA多线程方面的知识,在此总结一下
1、在Java程序中,JVM负责线程的调度。线程调度是指按照特定的机制为多个线程分配CPU的使用权。
调度的模式有两种:分时调度和抢占式调度。分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;抢占式调度是根据线程的优先级别来获取CPU的使用权。JVM的线程调度模式采用了抢占式模式。
2、Thread类实际上也是实现了Runnable接口的类。
在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target) 构造出对象,然后调用Thread对象的start()方法来运行多线程代码。
实际上所有的多线程代码都是通过运行Thread的start()方法来运行的。因此,不管是扩展Thread类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程编程的基础。
3、JAVA多线程涉及到2个问题,一个是线程的调度,另一个是线程的同步
4、线程的状态有:new、runnable、running、waiting、timed_waiting、blocked、dead
当执行new Thread(Runnable r)后,新创建出来的线程处于new状态,这种线程不可能执行
当执行thread.start()后,线程处于runnable状态,这种情况下只要得到CPU,就可以开始执行了。runnable状态的线程,会接受JVM的调度,进入running状态,但是具体何时会进入这个状态,是随机不可知的
running状态中的线程最为复杂,可能会进入runnable、waiting、timed_waiting、blocked、dead状态:
如果CPU调度给了别的线程,或者执行了Thread.yield()方法,则进入runnable状态,但是也有可能立刻又进入running状态
如果执行了Thread.sleep(long),或者thread.join(long),或者在锁对象上调用object.wait(long)方法,则会进入timed_waiting状态
如果执行了thread.join(),或者在锁对象上调用了object.wait()方法,则会进入waiting状态
如果进入了同步方法或者同步代码块,没有获取锁对象的话,则会进入blocked状态
处于waiting状态中的线程,如果是因为thread.join()方法进入等待的话,在目标thread执行完毕之后,会回到runnable状态;如果是因为object.wait()方法进入等待的话,在锁对象执行object.notify()或者object.notifyAll()之后会回到runnable状态
处于timed_waiting状态中的线程,和waiting状态中的差不多,只不过是设定时间到了,就会回到runnable状态
处于blocked状态中的线程,只有获取了锁之后,才会脱离阻塞状态
当线程执行完毕,或者抛出了未捕获的异常之后,会进入dead状态,该线程结束
5、当线程池中线程都具有相同的优先级,调度程序的JVM实现自由选择它喜欢的线程。这时候调度程序的操作有两种可能:一是选择一个线程运行,直到它阻塞或者运行完成为止。二是时间分片,为池内的每个线程提供均等的运行机会。
6、设置线程的优先级:线程默认的优先级是创建它的执行线程的优先级。可以更改线程的优先级。
JVM从不会改变一个线程的优先级。然而,1-10之间的值是没有保证的。一些JVM可能不能识别10个不同的值,而将这些优先级进行每两个或多个合并,变成少于10个的优先级,则两个或多个优先级的线程可能被映射为一个优先级。
7、Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。
yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。
结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
8、另一个问题是线程的同步,这个我感觉比调度更加复杂一些
Java中每个对象都有一个“内置锁”,也有一个内置的“线程表”
当程序运行到非静态的synchronized方法上时,会获得与正在执行代码类的当前实例(this实例)有关的锁;当运行到同步代码块时,获得与声明的对象有关的锁
释放锁是指持锁线程退出了synchronized方法或代码块。
当程序运行到synchronized同步方法或代码块时对象锁才起作用。
一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。
9、当提到同步(锁定)时,应该清楚是在哪个对象上同步(锁定)?
obj.wait()
obj.notify()
obj.notifyAll()
关于这3个方法,有一个关键问题是:
必须从同步环境内调用wait()、notify()、notifyAll()方法。只有拥有该对象的锁的线程,才能调用该对象上的wait()、notify()、notifyAll()方法
与每个对象具有锁一样,每个对象也可以有一个线程列表,他们等待来自该对象的通知。线程通过执行对象上的wait()方法获得这个等待列表。从那时候起,它不再执行任何其他指令,直到调用对象的notify()方法为止。如果多个线程在同一个对象上等待,则将只选择一个线程(不保证以何种顺序)继续执行。如果没有线程等待,则不采取任何特殊操作。
11、下面贴几个代码实例,配合jstack命令说明一下
public class ThreadA {
public static void main(String[] args) {
ThreadB b = new ThreadB();// ThreadB status: new
b.start();// ThreadB status: runnable
synchronized (b) {
System.out.println("等待对象b完成计算。。。");
Thread.sleep(60000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("b对象计算的总和是:" + b.total);
public class ThreadB extends Thread {
public void run() {
synchronized (this) {
for (int i = 0; i & 101; i++) {
notifyAll();
jstack输出的结果是:
"main" prio=6 tid=0x nid=0x1638 waiting on condition [0x]
&& java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at net.kyfxbl.lock.ThreadA.main(ThreadA.java:20)
- locked &0x22a18a90& (a net.kyfxbl.lock.ThreadB)
"Thread-0" prio=6 tid=0x02bbb800 nid=0x1410 waiting for monitor entry [0x02f0f000]
&& java.lang.Thread.State: BLOCKED (on object monitor)
at net.kyfxbl.lock.ThreadB.run(ThreadB.java:11)
- waiting to lock &0x22a18a90& (a net.kyfxbl.lock.ThreadB)
可以看到,主线程和新线程在同一个对象上锁定,主线程的方法里执行了Thread.sleep(60000),因此进入了TIMED_WAITING状态,而新线程则进入BLOCKED状态
public class ThreadA {
public static void main(String[] args) {
ThreadB b = new ThreadB();// ThreadB status: new
b.start();// ThreadB status: runnable
synchronized (b) {
System.out.println("等待对象b完成计算。。。");
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("b对象计算的总和是:" + b.total);
public class ThreadB extends Thread {
public void run() {
synchronized (this) {
Thread.sleep(60000);
} catch (InterruptedException e) {
e.printStackTrace();
for (int i = 0; i & 101; i++) {
notifyAll();
jstack输出的结果是:
"main" prio=6 tid=0x nid=0x1684 in Object.wait() [0x]
&& java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on &0x22a18b08& (a net.kyfxbl.lock.ThreadB)
at java.lang.Object.wait(Object.java:485)
at net.kyfxbl.lock.ThreadA.main(ThreadA.java:22)
- locked &0x22a18b08& (a net.kyfxbl.lock.ThreadB)
"Thread-0" prio=6 tid=0x02bcc800 nid=0x19c waiting on condition [0x02f0f000]
&& java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at net.kyfxbl.lock.ThreadB.run(ThreadB.java:12)
- locked &0x22a18b08& (a net.kyfxbl.lock.ThreadB)
2个线程还是在同一个对象上同步,但这次主线程立刻执行了b.wait()方法,因此释放了对象b上的锁,自己进入了WAITING状态。接下来新线程得到了对象b上的锁,所以没有进入阻塞状态,紧接着执行Thread.sleep(60000)方法,进入了TIMED_WAITING状态
public class ThreadA {
public static void main(String[] args) {
ThreadB b = new ThreadB();// ThreadB status: new
b.start();// ThreadB status: runnable
synchronized (b) {
System.out.println("等待对象b完成计算。。。");
b.wait();// ThreadB status: running
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("b对象计算的总和是:" + b.total);
public class ThreadB extends Thread {
public void run() {
synchronized (this) {
for (int i = 0; i & 101; i++) {
notifyAll();
System.out.println("我要睡了");
Thread.sleep(60000);
} catch (InterruptedException e) {
e.printStackTrace();
jstack输出的结果是:
"main" prio=6 tid=0x nid=0x3ec in Object.wait() [0x]
&& java.lang.Thread.State: BLOCKED (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on &0x22a18ba0& (a net.kyfxbl.lock.ThreadB)
at java.lang.Object.wait(Object.java:485)
at net.kyfxbl.lock.ThreadA.main(ThreadA.java:20)
- locked &0x22a18ba0& (a net.kyfxbl.lock.ThreadB)
"Thread-0" prio=6 tid=0x02bbb800 nid=0x14b4 waiting on condition [0x02f0f000]
&& java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at net.kyfxbl.lock.ThreadB.run(ThreadB.java:19)
- locked &0x22a18ba0& (a net.kyfxbl.lock.ThreadB)
当主线程执行b.wait()之后,就进入了WAITING状态,但是新线程执行notifyAll()之后,有一个瞬间主线程回到了RUNNABLE状态,但是好景不长,由于这个时候新线程还没有释放锁,所以主线程立刻进入了BLOCKED状态
12、当在对象上调用wait()方法时,执行该代码的线程立即放弃它在对象上的锁。然而调用notify()时,并不意味着这时线程会放弃其锁。如果线程仍然在完成同步代码,则线程在移出之前不会放弃锁。因此,只要调用notify()并不意味着这时该锁被释放
13、与线程休眠类似,线程的优先级仍然无法保障线程的执行次序。只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行。
14、在一个线程中开启另外一个新线程,则新开线程称为该线程的子线程,子线程初始优先级与父线程相同。
15、JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态,因此,在使用后台线程时候一定要注意这个问题。
16、下面说说我们这次JBOSS挂死问题的处理方法
现象:系统运行一段时间之后,发现有几个子系统无法访问了,但是另外几个可以。CPU占用达到100%
观察了一下,发现无法访问的应用都部署在同一个JBOSS里,于是把该JBOSS的堆栈用jstack命令输出
发现里面有大量的线程处于BLOCKED状态,均是在执行到c3p0的一个方法里的某一行时,BLOCKED住了
于是下载c3p0的源码,跟进去看了一下,这是一个同步方法,内部会去获取数据库连接,如果获取到连接,就进行下一步操作,如果获取不到,就执行sleep(long timeout)方法。
反推一下,我猜测可能是这样的:
由于某段代码没有释放数据库连接--&连接池中的连接耗尽--&部分线程无限TIMED_WAITING--&其余线程都BLOCKED--&开启新线程--&频繁引发GC--&占用大量CPU--&应用挂起
后来对所有涉及到数据库连接的代码进行排查,发现确实有几个地方做完数据库操作以后,没有释放连接。把这部分代码改掉,重新启动JBOSS,没有再出现JBOSS挂起的现象
浏览 11873
论坛回复 /
(15 / 22731)
浏览: 1098638 次
来自: 深圳
好文章,解决了大问题!
不错,值得借鉴
赞!!!!!!
请问你装的是哪个版本的oepnssl?

我要回帖

更多关于 winhttp 多线程 的文章

 

随机推荐