Java多线程:线程应访问列表

Java多线程:线程应访问列表,java,multithreading,performance,parallel-processing,thread-safety,Java,Multithreading,Performance,Parallel Processing,Thread Safety,我用五个线程运行,我有一个对象列表(我独立于线程进行初始化)。 列表中的对象使用布尔值作为标志,因此我知道它们是否已经被另一个线程处理过。另外,我的线程的“ID”有一个整数(这样你就知道哪个线程当前正在工作) 问题:第一个参与for循环的线程将处理列表中的所有对象,但我希望线程交替。我做错了什么 run()方法与此类似: void run() { for (int i = 0; i < list.size(); i++) { ListObject currentOb

我用五个线程运行,我有一个对象列表(我独立于线程进行初始化)。 列表中的对象使用布尔值作为标志,因此我知道它们是否已经被另一个线程处理过。另外,我的线程的“ID”有一个整数(这样你就知道哪个线程当前正在工作)

问题:第一个参与for循环的线程将处理列表中的所有对象,但我希望线程交替。我做错了什么

run()方法与此类似:

void run() {
    for (int i = 0; i < list.size(); i++) {
        ListObject currentObject = list.get(i);
        synchronized (currentObject) {
            if (currentObject.getHandled == false) {
                currentObject.setHandled(true);
                System.out.println("Object is handled by " + this.getID());
            } else {
                continue;
            }
        }
    }
}
void run(){
对于(int i=0;i
TL;DR显式或隐式地在线程之间划分列表;如果真的需要同步

问题是:第一个参与for循环的线程将 处理列表中的所有对象,但我希望线程交替。 我做错了什么

这是整个代码块所期望的

  for (int i = 0; i < list.size(); i++) {
        ListObject currentObject = list.get(i);
        synchronized (currentObject) {
            ....
        }
    }
方法2:如果必须使用执行器显式并行化代码

void run() {
    for (int i = threadID; i < list.size(); i += total_threads) {
        ListObject currentObject = list.get(i);
        if (currentObject.getHandled == false) {
           currentObject.setHandled(true);
           System.out.println("Object is handled by " + this.getID());
       }
    }
}
我正在运行五个线程

(如欧内斯特·k所示)

方法3:如果必须显式使用线程

void run() {
    for (int i = threadID; i < list.size(); i += total_threads) {
        ListObject currentObject = list.get(i);
        if (currentObject.getHandled == false) {
           currentObject.setHandled(true);
           System.out.println("Object is handled by " + this.getID());
       }
    }
}
其中,
task
将是一个原子整数(即,
AtomicInteger task=new AtomicInteger();

在所有方法中,想法都是相同的将列表中的不同区块分配给线程,以便这些线程可以彼此独立地执行这些区块。


如果假设为1。二,。如果不能,那么您仍然可以应用前面提到的在线程之间分割迭代的逻辑,但是您需要在下面的代码块中添加同步(在我的示例中):

  private void setHandled(ListObject currentObject) {
        if (!currentObject.getHandled) {
            currentObject.setHandled(true);
            System.out.println("Object is handled by " + this.getID());
        }
    }
按原样,您只需将
currentObject
字段转换为
AtomicBoolean
,如下所示:

private void setHandled(ListObject currentObject) {
    if (currentObject.getHandled.compareAndSet(false, true)) {
        System.out.println("Object is handled by " + this.getID());
    }
}
否则,请使用synchronized子句:

private void setHandled(ListObject currentObject) {
        synchronized (currentObject) {
            if (!currentObject.getHandled) {
                currentObject.setHandled(true);
                System.out.println("Object is handled by " + this.getID());
            }
       }
 }
private void setHandled(ListObject currentObject) {
    if (currentObject.getHandled.compareAndSet(false, true)) {
        System.out.println("Object is handled by " + this.getID());
    }
}
private void setHandled(ListObject currentObject) {
        synchronized (currentObject) {
            if (!currentObject.getHandled) {
                currentObject.setHandled(true);
                System.out.println("Object is handled by " + this.getID());
            }
       }
 }