gpt4 book ai didi

java arraylist通过java 8中的remove方法返回相同的对象

转载 作者:行者123 更新时间:2023-12-01 21:23:21 26 4
gpt4 key购买 nike

我有两个线程共享同一列表,第一个线程在列表中添加新对象,第二个线程在同一列表上执行删除。启动一段时间后,两个线程我得到了相同的对象,为什么以及如何?

JAVA代码:SubmitJob 将 ThreadRuning 类添加到列表中。

public class SubmitJob extends Thread{

public SubmitJob(List l){
list = l;
}
List<ThreadRuning> list;
private static int counter =0;
public void run(){

while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ThreadRuning t = new ThreadRuning();
t.setThreadname("Thread Name "+counter);
t.setStarttime(new Date().getTime());
list.add(t);
//System.out.println("Submited"+t.getThreadname());
counter++;
}
}
}

第二类只是从列表中删除对象。

public class JobMoniter extends Thread {

public JobMoniter(List l){
list = l;
}

List<ThreadRuning> list;

public void run() {
while (true) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

if (list.size()>0) {
ThreadRuning t = list.remove(0);
System.out.println(t.getState()+" name "+t.getThreadname());
if(t!=null)t.start();
//System.out.println("Startinf job"+t.getThreadname());
}
}
}
}

当我收到错误java.lang.IllegalThreadStateException时,我认为这是相关的线程问题,经过一番研究后我发现是因为尝试启动同一个线程两次。并得到这个错误,所以我从列表中获取线程的名称,而不是我知道一旦列表大小增加,删除方法就会返回相同的对象两次,这在java中是可能的吗?其余代码如下。

public class ThreadUtile {

public static void main(String[] args) {
List<ThreadRuning> list = new ArrayList<ThreadRuning>();
new SubmitJob(list).start();
new JobMoniter(list).start();

}

}

ThreadRuning 类:

public class ThreadRuning extends Thread{

private long starttime;
private String threadname;

public void run(){
for(int i=0;i<10;i++){
//System.out.println("Name of Thread "+threadname+ "Executing times"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// getter setter.


}

注意:我谷歌但没有为什么?如果我从 JobMoniter 类中删除 t.start() 部分,并将线程名称存储在字符串中,并在下次多次找到相同名称时进行比较,但不是每次.

如有任何进一步的疑问,请写在评论中。

最佳答案

除了您尝试在并发环境中处理 ArrayList 之外,您还应该真正了解 Java 中的引用是什么。

if (list.size()>0) {
ThreadRuning t = list.remove(0);
System.out.println(t.getState()+" name "+t.getThreadname());
if(t!=null)t.start();
//System.out.println("Startinf job"+t.getThreadname());
}

方法ArrayList.remove(int index)返回被移除的对象。它不会创建它的新实例。这就是为什么当您尝试再次启动线程时会收到 IllegalThreadStateException 的原因。

关于java arraylist通过java 8中的remove方法返回相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38766924/

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