在Java中的单独Thread中从ArrayList中删除项

时间:2013-05-26 18:30:59

标签: java multithreading arraylist

我的循环很长。

在循环内部我有另一个循环来迭代(使用迭代器)在arrayList上。

如果在循环遍历数组列表时满足条件,则在向其传递当前数组列表项以及当前迭代器时启动一个线程。

一些示例代码:

List<Test> testList = Collections.synchronizedList(new ArrayList<Test>());

//scanTests in a thread
while(scanTests) {
    for(Iterator<Test> itr = this.testList.iterator(); itr.hasNext();) {
        Test test = itr.next();
        if (test.closed == true && !test.inUpdateThread) {
            test.inUpdateThread = true;
            UpdateThread urt = new UpdateThread(test, itr);
            new Thread(urt).start();
        }
    }
}

//scanSomethingElse is in another thread
while (scanSomethingElse) {
    //manipulating testList 
}

如果 UpdateThread 中符合条件,我想从 testList 中删除该项,如下所示:

this.itr.remove();

我有另一个长时间运行的循环(在另一个单独的线程中)并且它在数组List上执行类似的处理(读,写等...)。

我的问题是,如果在另一个循环中,我正在迭代 testList ,这是否会反映其他循环的变化?

(如果您想知道为什么我使用线程进行同步,这是为了远程资源和数据库交互,我需要这个循环在没有等待时间的情况下保持恒定和瞬间。)

1 个答案:

答案 0 :(得分:0)

为什么不使用以下内容:

while (true) {
    for (int i = 0;i < testList.size(); i++) {
        Test test = testList.get(i);
        if (test.closed == true && !test.inUpdateThread) {
            test.inUpdateThread = true;
            UpdateThread urt = new UpdateThread(some other constructor here);
            new Thread(urt).start();
        }; 

    };
};

// UpdateThread类有一个consructor UpdateThread(Test test,Iterator itr)。所以只需修改它以适合这个例子,或发布它我认为ki可以为你做。