0

私は最近 Java の学習を開始し、現在は大学の並行プログラミング クラスで Java を使用しています。

私はいくつかのスレッドを開始し、それらを特定の順序で実行する必要があるラボの課題に取り組んでいます。コードは次のとおりです。

import java.util.concurrent.CountDownLatch;


class Lab1{

public static void main(String[] args){

    CountDownLatch leftLatch = new CountDownLatch(3);
    CountDownLatch midLatch = new CountDownLatch(1);

    LabThread t1 = new LabThread();
    new Thread(t1).start();

    // (new Thread(new LabThread(new CountDownLatch(1),leftLatch,1))).start();
    // (new Thread(new LabThread(new CountDownLatch(0),leftLatch,2))).start();
    // (new Thread(new LabThread(new CountDownLatch(0),leftLatch,3))).start();
    // (new Thread(new LabThread(leftLatch,midLatch,4))).start();
 //     (new Thread(new LabThread(midLatch,new CountDownLatch(0),5))).start();
    // (new Thread(new LabThread(midLatch,new CountDownLatch(0),6))).start();
    // (new Thread(new LabThread(midLatch,new CountDownLatch(0),7))).start();
}
}

public class LabThread implements Runnable{

CountDownLatch waitLatch = null;
CountDownLatch decLatch = null;
int threadNr;

public LabThread(CountDownLatch waitLatch, CountDownLatch decLatch,int threadNr){
    this.waitLatch = waitLatch;
    this.decLatch = decLatch;
    this.threadNr = threadNr;
}

public void run(){
    try{
        this.waitLatch.await();
        this.decLatch.countDown();
    }catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(threadNr);
}
}

コンパイルしようとすると、次のエラーが発生します。

Lab1.java:12: error: constructor Thread in class Thread cannot be applied to given types;
    new Thread(t1).start();
    ^
required: CountDownLatch,CountDownLatch,int
found: LabThread
reason: actual and formal argument lists differ in length
1 error

私はそれがかなり自明であることを知っていますが、回避策を見つけることができませんでした. 私はたくさんのことを試しました: オーバーロードされたコンストラクターを取り除き、Runnable を実装する代わりに Thread を拡張するなど、私が役立つと思ったものは何でも役に立ちますが、この同じエラーで私を悩ませ続け、本当にばかげています。解決策を知っている場合は、これについてあなたの知恵を私と共有してください!

PS : 私のロジックに少し欠陥があるかもしれないことはわかっていますが、コンパイル後に修正します :)

編集: *問題解決* ! どうやら私がする必要があったのは、プロジェクトをクリーンアップして(クラスファイルを削除して)、再度コンパイルすることだけでした。Tom Hawtin-tackline と fazomisiek に、そうするように勧めてくれてありがとう。古いファイルを残しておくと、新たにコンパイルするときに影響があることに気づきませんでした。私の悪い!:) ご提案いただきありがとうございます。こんなに早く回答が得られるとは思っていませんでした。

4

2 に答える 2

0

あなたの質問は少し厄介なようです-スローされた例外はあなたのコードに適合しません. ただし、次のようなものを使用する必要があります。

LabThread t1 = new LabThread(leftLatch, midLatch, 69);
new Thread(t1).start();

(ただし、達成したいロジック、つまり、実行するスレッドの数、実行時期などについて考える必要があります。)

ところで: コンパイルする前にファイルを保存していますか? (このエラーは予期しないものです)

BTW2: コンストラクターで super() を呼び出す必要があります (親クラスのコンストラクターを呼び出す必要があります - これは良い方法です)。

于 2013-10-24T09:26:35.720 に答える