需求是开四个线程访问一个Vector(因为Vector是线程安全的),取得Vector的信息,这个信息是要一段时间进行处理,就是说,取得信息访问之后,可能这个信息还没有处理完,所以要先等一等,先取得取得Vector下一个元素再访问。
现在我遇上的问题是
怎么在开四个线程的时候,保持Vector的共同性,就是在一个线程取得信息之后,成功处理,让其他三个不要再访问当前元素了。
四个线程怎么按照顺序完成对Vector的每个元素的访问。
初次尝试
1. 因为Java引用的存在,所以在每个线程里修改是可以见的,但是要加volatile修饰,否则只会在当前线程中的工作区可见,而不能到所有线程的工作区。
- 可以用哲学家算法,为一条信息增加一个boolean判断值,如果有线程正在访问就修改该boolean判断值为1,再结束访问之后,修改会0。在里面并不关心顺序问题,只要所有信息被处理就好了。Vector是线程安全的ArrayList所以也可以用下标访问,所以我的循环条件就是
while(true){
while(true){
如果当前指向的数组正在被访问 指向的位置向前一步,如果超出了Vector的范围取模
如果当前指向的数组没有被访问 跳出当前的死循环
如果当前所有的数组信息都被访问到了 结束这个线程
}
取得对应Vector的信息
发往Url处理
根据结果 判断是否成功还是未处理完
成功或失败 分别放入对应的地方
未处理完 继续下一个循环
}
二改
应该讲状态数组和数据处理两件事分成两部分,而不是混在一个线程里完成,所以说我们需要在这个线程中获得返回值,所以应该使用Callable。并且多线程的操作可以使用Java里的ConCurrent包来完成。
这里要使用的ThreadPoolExecutor submit操作来获取线程执行的结果 所以我的设计是这样的
while(true){
判断 是否所有的信息都被处理 成功和失败的结果集相加=TaskId的Size
处理完跳出循环
//因为我开的是固定四个线程的线程池
for(1->4){
result = ThreadPoolExecutor.submit(index);
判断result 结果
加入相应的结果集
index = (index+1)%Size
}
}
终
理论上这一步并没有多少IO操作,并且数目不大的情况下影响并不大,所以单线程跑一个循环即可。
emmmmmmm