我正在尝试进行线程竞赛,但是我的线程按顺序运行而不是并行运行...在线程完成比赛后,它必须通知上下文并且上下文应该宣布获胜者并停止比赛。我该怎么修呢?
My ThreadRaceClass:
public class ThreadRace {
List<ThreadRaceCompetitor> competitors = new ArrayList<>(10);
public ThreadRace() {
for (int i = 0; i < 10; i++) {
competitors.add(new ThreadRaceCompetitor());
}
}
public void start() {
competitors.forEach(ThreadRaceCompetitor::run);
}
}
ThreadCompetitor对象:
public class ThreadRaceCompetitor implements Runnable {
private static final ThreadRaceContext context = new ThreadRaceContext();
private static AtomicInteger count = new AtomicInteger(0);
private int raceNumber;
private int progress = 0;
public ThreadRaceCompetitor() {
raceNumber = count.incrementAndGet();
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("Thread " + raceNumber + " is running with " + i + " speed and has covered " + progress + " kilometers / 20" );
try {
sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
progress++;
}
synchronized (context) {
context.announceWinner(raceNumber);
}
}
public int getRaceNumber() {
return raceNumber;
}
public int getProgress() {
return progress;
}
}
上下文:
public class ThreadRaceContext extends Thread {
public void announceWinner(int raceNumber) {
System.out.println("Competitor with number " + raceNumber + " won the race");
}
}
答案 0 :(得分:3)
你必须调用start方法。然后它应该工作。
public void start() {
competitors.forEach(ThreadRaceCompetitor::start); // not sure if that is possible...
}
//alternative
public void start() {
for(ThreadRaceCompetitor c: competitors) {
c.start();
}
}
答案 1 :(得分:1)
首先,你不是在这里创建任何线程。只需通过实现runnable就不会创建一个Thread类的实例。使用runnable,你必须创建一个Thread实例并启动它。
使用现有代码实现此目标的一种方法是,使用ThreadRaceCompetitor
扩展主题并使用ThreadRace
类start
方法调用start
方法列表中的每个ThreadRaceCompetitor
,而不是直接调用run
。