【Java】四个线程访问同一数组并作出相应修改

需求是开四个线程访问一个Vector(因为Vector是线程安全的),取得Vector的信息,这个信息是要一段时间进行处理,就是说,取得信息访问之后,可能这个信息还没有处理完,所以要先等一等,先取得取得Vector下一个元素再访问。

现在我遇上的问题是

  1. 怎么在开四个线程的时候,保持Vector的共同性,就是在一个线程取得信息之后,成功处理,让其他三个不要再访问当前元素了。

  2. 四个线程怎么按照顺序完成对Vector的每个元素的访问。

初次尝试
1. 因为Java引用的存在,所以在每个线程里修改是可以见的,但是要加volatile修饰,否则只会在当前线程中的工作区可见,而不能到所有线程的工作区。

  1. 可以用哲学家算法,为一条信息增加一个boolean判断值,如果有线程正在访问就修改该boolean判断值为1,再结束访问之后,修改会0。在里面并不关心顺序问题,只要所有信息被处理就好了。Vector是线程安全的ArrayList所以也可以用下标访问,所以我的循环条件就是
    while(true){
        while(true){
        如果当前指向的数组正在被访问 指向的位置向前一步,如果超出了Vector的范围取模
        如果当前指向的数组没有被访问 跳出当前的死循环

        如果当前所有的数组信息都被访问到了 结束这个线程
}

        取得对应Vector的信息
        发往Url处理
        根据结果 判断是否成功还是未处理完
            成功或失败 分别放入对应的地方
            未处理完 继续下一个循环
        }

二改
应该讲状态数组和数据处理两件事分成两部分,而不是混在一个线程里完成,所以说我们需要在这个线程中获得返回值,所以应该使用Callable。并且多线程的操作可以使用Java里的ConCurrent包来完成。

这里要使用的ThreadPoolExecutor submit操作来获取线程执行的结果 所以我的设计是这样的

while(true){
    判断 是否所有的信息都被处理 成功和失败的结果集相加=TaskId的Size 
        处理完跳出循环
    //因为我开的是固定四个线程的线程池

    for1->4){
        result = ThreadPoolExecutor.submit(index);
        判断result 结果
            加入相应的结果集
        index = (index+1)%Size
    }
}

理论上这一步并没有多少IO操作,并且数目不大的情况下影响并不大,所以单线程跑一个循环即可。
emmmmmmm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值