我编写了这个程序来同步多个线程,这个prog的功能是每个跑步者线程得到一些随机值,我们需要按顺序对它们进行排序,但是有时候prog会得到空指针异常。这是relayrace.java
package com.mani.threadstrail;
import java.util.Random;
import java.util.LinkedList;
import java.util.List;
public class RelayRace extends Thread{
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=0;i<10;i++)
{
RelayRace r= new RelayRace();
r.setName("runner-"+ i);
r.start();
}
try {
Thread.sleep(1000);
Runner.sortings();
Runner.printlist();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() {
Random rand = new Random();
int n = rand.nextInt(50) + 1;
System.out.println(Thread.currentThread().getName()+" "+ n);
Runner r1 = new Runner(n,Thread.currentThread().getName());
r1.add();
}
}
这是runner.java
package com.mani.threadstrail;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class Runner implements Comparable<Runner> {
static List<Runner> a = new LinkedList<Runner>();
public int speed;
public String name;
Runner(int speed,String name){
this.name=name;
this.speed= speed;
}
public synchronized void add() {
a.add(this);
}
static synchronized void printlist() {
for(Runner st:a){
System.out.println(st.speed+" "+st.name);
}
}
static void sortings() {
Collections.sort(a);
}
@Override
public int compareTo(Runner o) {
return -(this.speed-o.speed);
}
}
答案 0 :(得分:2)
你得到一个NPE,因为当你尝试对它进行排序时,列表中有空元素。
这些如何进入?你不添加它们......
好了,列表a
上的同步未正确完成。
Runner
add()
方法this
同步printlist()
。 Runner.class
会在sortings()
上同步,因为它是一种静态方法。 Runner.class
根本不会同步,即使它确实修改了列表。使用正确的同步(例如,通过同步NullPointerException
上的所有三个连接),您将摆脱class a implements ItemListener
s