请教一个ArrayList加锁的问题

问题描述

需求是这样的,批量发送邮件:选一批接收人,点击发送邮件,把这批人加到代发数组里(array),开启线程开始发送,发一封从array里remove掉一个,如果此时代发还没发完,这时又选一批接收人,点击发送邮件,要把这次选的人加到刚才的代发数组里继续发送代码如下:privatevoidbtnSend_click(){lock(arryList.SyncRoot){foreach(stringstrGroupinOneLstGroup.Items){poLedInfo[]pos=m_boLedInfo.GetInfoByGroupName(strGroup);foreach(poLedInfopoinpos){//SendToSingleMemeber(po,/*po.Name+":"+*/strContent);arryList.Add(newListItem(strContent,po));}}}if(!m_bSending)//开启线程发送{Threadt=newThread(newThreadStart(SendFunc));t.Start();}}//发送线程privatevoidSendFunc(){m_bSending=true;//正在发送lock(arryList.SyncRoot){while(arryList.Count>0){Console.WriteLine("----------------{0}",arryList.Count);ListItemlst=(ListItem)arryList[0];poLedInfopo=lst.ValueaspoLedInfo;SendToSingleMemeber(po,lst.Name);arryList.RemoveAt(0);Thread.Sleep(10);}}Console.WriteLine("''''''----------------{0}",arryList.Count);m_bSending=false;}

现在遇到问题了,第一次点button后进线程发送,第二次再点(第一次线程还没发完),程序就挂了,貌似死锁了估计是锁用的不对,哪位大神帮忙看下怎么改?谢谢

解决方案

解决方案二:
楼主你的号是从别人手里买来的吗?
解决方案三:
arryList.SyncRoot这个是静态吧?为什么不在当前类定义个变量呢?
解决方案四:
引用楼主gxingmin的回复:

需求是这样的,批量发送邮件:选一批接收人,点击发送邮件,把这批人加到代发数组里(array),开启线程开始发送,发一封从array里remove掉一个,如果此时代发还没发完,这时又选一批接收人,点击发送邮件,要把这次选的人加到刚才的代发数组里继续发送代码如下:privatevoidbtnSend_click(){lock(arryList.SyncRoot){foreach(stringstrGroupinOneLstGroup.Items){poLedInfo[]pos=m_boLedInfo.GetInfoByGroupName(strGroup);foreach(poLedInfopoinpos){//SendToSingleMemeber(po,/*po.Name+":"+*/strContent);arryList.Add(newListItem(strContent,po));}}}if(!m_bSending)//开启线程发送{Threadt=newThread(newThreadStart(SendFunc));t.Start();}}//发送线程privatevoidSendFunc(){m_bSending=true;//正在发送lock(arryList.SyncRoot){while(arryList.Count>0){Console.WriteLine("----------------{0}",arryList.Count);ListItemlst=(ListItem)arryList[0];poLedInfopo=lst.ValueaspoLedInfo;SendToSingleMemeber(po,lst.Name);arryList.RemoveAt(0);Thread.Sleep(10);}}Console.WriteLine("''''''----------------{0}",arryList.Count);m_bSending=false;}

现在遇到问题了,第一次点button后进线程发送,第二次再点(第一次线程还没发完),程序就挂了,貌似死锁了估计是锁用的不对,哪位大神帮忙看下怎么改?谢谢

为何解析的时候要不停的起新的线程呢?消费者线程起一个就够了。个人理解:运行时间段-线程池,时间长-单独线程。
解决方案五:
用Queue<ListItem>代替Array就不用锁了。
解决方案六:
你这么写,只有第一次点击的所有邮件发送完,才能添加本次新增的列表
解决方案七:
http://blog.csdn.net/wangzhiyu1980/article/details/45497907
解决方案八:
去掉锁,用公共变量m_bSending控制,每次点击按钮,先停止邮件发送,添加新邮件到列表后,再开始发送邮件publicboolisFinished=false;//当前发送的邮件完成是否完成privatevoidbtnSend_click(){//lock(arryList.SyncRoot)//{m_bSending=false;//计划停止发送while(!isFinished){System.Threading.Thread.Sleep(30000);//给足够时间让当前发送邮件完成}//假设你下面的代码是在添加新邮件到列表foreach(stringstrGroupinOneLstGroup.Items){poLedInfo[]pos=m_boLedInfo.GetInfoByGroupName(strGroup);foreach(poLedInfopoinpos){//SendToSingleMemeber(po,/*po.Name+":"+*/strContent);arryList.Add(newListItem(strContent,po));}}//}if(!m_bSending)//开启线程发送{Threadt=newThread(newThreadStart(SendFunc));t.Start();}}//发送线程privatevoidSendFunc(){m_bSending=true;//正在发送//lock(arryList.SyncRoot)//{while(arryList.Count>0&&m_bSending){isFinished=false;Console.WriteLine("----------------{0}",arryList.Count);ListItemlst=(ListItem)arryList[0];poLedInfopo=lst.ValueaspoLedInfo;SendToSingleMemeber(po,lst.Name);arryList.RemoveAt(0);Thread.Sleep(10);isFinished=true;}//}Console.WriteLine("''''''----------------{0}",arryList.Count);m_bSending=false;}

解决方案九:
4楼的做法可以

时间: 2024-11-05 12:32:16

请教一个ArrayList加锁的问题的相关文章

同步-请教一个很奇葩的线程加锁问题

问题描述 请教一个很奇葩的线程加锁问题 先上代码: import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class MySyncObject { private Integer count = 0; private Integer obj = 0; private Lock lock

页面跳转-请教一个Activity跳转到另外一个Activity失败的问题

问题描述 请教一个Activity跳转到另外一个Activity失败的问题 package com.example.t; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; impo

请教一个关于java正则表达式的问题

问题描述 请教一个关于java正则表达式的问题 一长串字符串中有字母数字逗号句号感叹号冒号空格退格符回车,我需要捕获的是所有"字母数字"的任意组合(区分大小写),而这些组合又由"逗号句号感叹号冒号空格退格符回车"的任意组合隔开,请问我该怎么写呢? 比如 "fdjfk23jkj0 ,. djfk !s2SJDKd djfk 232 : ! d .. s"字符串经过操作返回这样一个列表[fdjfk23jkj0,djfk,s2SJDKd,djfk,23

请教一个数据库分组问题

问题描述 请教一个数据库分组问题 我写了这么一个脚本 SELECT da_sp.spdm da_sp.sp da_sp.jldw da_sp.ggxh da_sp.wbdw da_sp.wbbzl da_sp.nbdw da_sp.nbbzl da_sp.cbj da_sp.zhjj da_sp.pddw da_sp.pdxs da_sp.fdyclbj da_sp.zjpsbj xs_jxcrb.spnm sum(xs_jxcrb.cksl) as cksl isnull(c.bqsl0) a

新人请教一个sscanf中的正则表达式的问题

问题描述 新人请教一个sscanf中的正则表达式的问题 比如一串字符我要取其中的数字,df3600sdf365dssdfwef2135fewe@35@#%dsaf54我用""%*[^0-9]%[0-9]""只能取到3600,""%*[^0-9]""也错误..应该怎么取啊 解决方案 正则 直接用 d+ 即可 解决方案二: 这个应该怎么写..求写法

java-小弟想请教一个问题.对于大神们来说很简单

问题描述 小弟想请教一个问题.对于大神们来说很简单 小弟的这个程序很简单 但是对于小弟来说实在是太难了 本来前面的已经实现了,但是算总分的时候第二个人的成绩总是要和第一个成绩相加,这是程序这是运行后的结果就想问问大神怎么做把两个人的总分成绩分开 求大神帮帮忙哈 解决方案 zhongfen[i]=bianliang; 下一行加上 bianliang=0; 解决方案二: 变量 bianliang 在每次输入学生姓名是清零.

请教一个关于java的项目问题

问题描述 请教一个关于java的项目问题 解决方案 类似的http://down.51cto.com/data/2009264http://download.csdn.net/detail/u010777420/5426033 解决方案二: 你自己先试着做呗,你先熟悉Java Web从前台到后端的流程,一块块地实现,自己实现的东西,即使碰到问题,自己解决,收获会很大的. 解决方案三: 这跟我前一段时间写的 差不多, 用 java web, 我博客里有内容分页实现,登录注册,类比的可以写出来这些,

ext 权限 menu 动态-我想请教一个关于Ext JS4根据权限动态生成左侧树形菜单,和上侧Menu下拉菜单。

问题描述 我想请教一个关于Ext JS4根据权限动态生成左侧树形菜单,和上侧Menu下拉菜单. 我现在根据自己想的写了一个动态生成树的例子:数据库有 用户表 : 里面有个角色id ,角色表: 里面有个可以访问页面的Id号.然后我登陆的时候会判断用户拥有哪些id号,再根据id号生成树形菜单. 现在我在页面上侧加Menu的下拉菜单.也想根据权限生成,但是没有思路..想请教下各位,有什么例子可以借鉴 或者指点一下.谢谢啦 ~~

app-我想请教一个AS菜鸟级别问题

问题描述 我想请教一个AS菜鸟级别问题 Error:Execution failed for task ':app:processDebugManifest'. Manifest merger failed : uses-sdk:minSdkVersion 1 cannot be smaller than version 7 declared in library [com.android.support:appcompat-v7:23.0.0] D:WorkSpaceMediaPlayerap