当前位置: 首页 > 知识库问答 >
问题:

使用线程检查谁在2个类的比赛中获胜

曾弘扬
2023-03-14

所以在试图完成我的h. w,有一件事对我来说还不顺利。在这个程序中,我使用了2个类,这是一个跑步的压缩,我只是想宣布一个赢得比赛的玩家的位置。

例如:我们有4个线程。如果第二个线程最后达到100米,我想发布消息说他排在第四位。

参赛者类别:

    package assig1_2;
    public class Racer extends Thread{
    public static int globalid = 1;
    private int id;
    private int speed;
    private Track track;
    public Racer(int Speed,Track track) {
        this.speed = Speed;
        this.track = track;
        this.id = this.globalid;
        this.globalid++;
    }
    public void run() {
        go ();
    }
    void go () {
        this.track.setPriority(this.speed);
        for(int i=1; i<=10; i++) {

            System.out.println("runner " + this.id + " run " + i + " meters " );
            if (i == 10) {
                this.track.setPlace(id);
                System.out.println("Runner " + this.id + " finished " + track.getPlaceNumber() + track.getPlaceName() );

            }
        }

    }
  }

轨道等级:

   package assig1_2;

public class Track extends Thread {
    private int finishedRacers; 
    public String place;

    public void setPlace(int numOfPlace) {

        if (numOfPlace == 1) {
            this.finishedRacers = numOfPlace;
            this.place = "st";

        } else if (numOfPlace == 2) {
            this.finishedRacers = numOfPlace;
            this.place = "nd";

        } else if (numOfPlace == 3) {
            this.finishedRacers = numOfPlace;
            this.place = "rd";

        } else {
            this.finishedRacers = numOfPlace;
            this.place = "th";
        }


    }

    public int getPlaceNumber() {
        return this.finishedRacers;
    }

    public String getPlaceName() {
        return this.place;
    }

}

在我们的第一课中,当我们使用线程时,它是一个愚蠢的程序。

共有2个答案

宣煜
2023-03-14

这是主要问题。我们不能通过添加来改变其中的某些东西。

package assig1_2;

公共类assig1_2_main{

public static void main(String[] args){
    Track track = new Track();
    Racer racer1 = new Racer(10, track);
    Racer racer2 = new Racer(2, track);
    Racer racer3 = new Racer(3, track);
    Racer racer4 = new Racer(7, track);
    Thread t1 = new Thread(racer1);
    Thread t2 = new Thread(racer2);
    Thread t3 = new Thread(racer3);
    Thread t4 = new Thread(racer4);
    t1.start();
    t2.start();
    t3.start();
    t4.start();
}

}

乌靖
2023-03-14

我对您的程序做了一些更改,并引入了AtomicInteger和ExecutorService。赛道等级没有变化。

public class Racer extends Thread {

private static AtomicInteger atomicInteger = new AtomicInteger(0);
private int id;
private int speed;
private Track track;

private Racer(){}

public Racer(int Speed, Track track) {
    this.speed = Speed;
    this.track = track;
}

public int getPosition(){
    return atomicInteger.incrementAndGet();
}

public static void main(String[] args) throws InterruptedException {
    ExecutorService service = null;
    service = Executors.newFixedThreadPool(4);
    for (int i = 1; i <= 4; i++) {
        service.execute(() -> {
            new Racer(1, new Track()).go();
        });
    }
    service.awaitTermination(3, TimeUnit.SECONDS);
    if (service != null) service.shutdown();
}

void go() {
    this.track.setPriority(this.speed);
    for (int i = 1; i <= 10; i++) {

        System.out.println("runner " + Thread.currentThread().getName().substring(7,15) + " run " + i + " meters ");
        if (i == 10) {
            this.track.setPlace(getPosition());
            System.out.println("Runner " + Thread.currentThread().getName().substring(7,15) + " finished " +track.getPlaceNumber() +" "+ track.getPlaceName() );
        }
    }
} }
 类似资料:
  • 问题内容: 我正在尝试使所有子字符串与乘数匹配: 此示例按预期返回最后一个匹配项: 但是,我希望所有的字符串都由匹配,以得到如下内容: 有没有办法通过单个功能来做到这一点? 问题答案: 根据Kobi: PHP不支持捕获同一组 因此,这个问题没有解决方案。

  • 问题内容: 如果我有一个ajax调用(使用回调)取消获取,然后同时运行其他一些代码。当前两个函数都完成时,我将如何拥有第三个函数。我确信通过轮询(setTimeout,然后检查一些变量)很容易,但是我宁愿回调。 可能吗? 问题答案: 您可以为同时运行的AJAX调用和其他代码提供相同的回调,使用变量来跟踪它们的组合进度,然后将它们链接到如下所示的回调:

  • 我知道可以使用,现在不推荐使用。类似于咆哮的代码: 另外,也许可以将手动脚本写成字符串,但我怀疑这是否是正确的解决方案。任何创建正确查询的想法都将受到欢迎。

  • 问题内容: 我正在尝试实现2个线程。我的测试代码试图使用两个线程来执行以下方案: 线程B等待条件 线程A打印“ Hello”五次 线程A通知线程B 线程A等待 线程B打印“再见” 线程B向线程A发出信号 循环开始(x5) 到目前为止,代码将打印“ Hello”五次,然后卡住。从我看过的示例中,我似乎走对了,“锁定互斥锁,等待,由其他线程发出信号,解锁互斥锁,执行操作,循环” 测试代码: 朝着正确方

  • 问题内容: 我了解InterruptedException的功能以及抛出它的原因。但是在我的应用程序中,我在等待仅由我的应用程序知道的线程时得到了它,并且我的应用程序从不调用任何线程,也从未将线程的引用传递给任何人。 所以我的问题是:谁中断了我的线程? 有什么办法说吗?为什么有InterruptedException不包含请求中断的线程名称的原因? 我读到它可能是执行此操作的框架或库,我们使用以下