如何模拟并行运行的线程之间的竞争?

时间:2016-05-17 10:11:59

标签: java multithreading

我正在尝试进行线程竞赛,但是我的线程按顺序运行而不是并行运行...在线程完成比赛后,它必须通知上下文并且上下文应该宣布获胜者并停止比赛。我该怎么修呢?

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");
    }
}

2 个答案:

答案 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扩展主题并使用ThreadRacestart方法调用start方法列表中的每个ThreadRaceCompetitor,而不是直接调用run