gpt4 book ai didi

java - Java中线程的一致性

转载 作者:行者123 更新时间:2023-12-02 09:27:25 25 4
gpt4 key购买 nike

这里是 Java 新手。只是对该示例程序的不一致输出感到困惑。有时,task_queue.size() 为零,有时则不是。这可能是什么原因?

输出:

t4:[Task9999]已执行

t1:[Task9969]已执行

等待...

完成

剩余任务数:4

进程已完成,退出代码为 0

import java.util.ArrayList;

public class TaskExecutor implements Runnable {

private ArrayList<String> arr;

public TaskExecutor(ArrayList<String> arr) {
this.arr = arr;
}

@Override
public void run() {

String task;
while (arr.size() != 0 && (task = arr.remove(0))!=null) {
System.out.println(Thread.currentThread().getName() + " : [" + task + "] has been executed");
}
}
}

import java.util.ArrayList;

public class Main {

public static void main(String[] args) throws InterruptedException {

ArrayList<String> task_queue = new ArrayList<>();

for(int i = 0; i < 10000; i++) {
task_queue.add("Task" + i);
}

Thread t1 = new Thread(new TaskExecutor(task_queue));
Thread t2 = new Thread(new TaskExecutor(task_queue));
Thread t3 = new Thread(new TaskExecutor(task_queue));
Thread t4 = new Thread(new TaskExecutor(task_queue));
Thread t5 = new Thread(new TaskExecutor(task_queue));

t1.setName("t1");
t2.setName("t2");
t3.setName("t3");
t4.setName("t4");
t5.setName("t5");

t1.start();
t2.start();
t3.start();
t4.start();
t5.start();

System.out.println();

while(t1.isAlive() || t2.isAlive() || t3.isAlive() || t4.isAlive() || t5.isAlive()) {
}

System.out.println("waiting...");
Thread.currentThread().sleep(2000);
System.out.println("finished");
System.out.println("Number of Tasks left : " + task_queue.size());
}

}

最佳答案

为了举例,一种可能的不使用同步集合的同步方法:

public class TaskExecutor implements Runnable {

private ArrayList<String> arr;

public TaskExecutor(ArrayList<String> arr) {
this.arr = arr;
}

@Override
public void run() {

String task;

while (true)
{
synchronized(arr)
{
if(arr.size()==0)
break;

task = arr.remove(0);
if(task==null)
break;
}

System.out.println(Thread.currentThread().getName() + " : [" + task + "] has been executed");

}//end while

}//end run

}//end class

关于java - Java中线程的一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58239501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com