Java多线程:线程应访问列表
我用五个线程运行,我有一个对象列表(我独立于线程进行初始化)。 列表中的对象使用布尔值作为标志,因此我知道它们是否已经被另一个线程处理过。另外,我的线程的“ID”有一个整数(这样你就知道哪个线程当前正在工作) 问题:第一个参与for循环的线程将处理列表中的所有对象,但我希望线程交替。我做错了什么 run()方法与此类似: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
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());
}
}
}