0

こんにちは、スレッドについて理解しようとしていて、オブジェクト間の競合などの要素間の能力をシミュレートするように求められましたが、Java スレッドを使用してスレッドと実行可能を比較する必要があります。私は以下を実装しました:

public class lamborgini extends Thread {

     public void run() {
     int distance = 1000;
     int steps = 0;
     int velocity = 45;
     int acelerationTime = 800;
     while (steps < distance) {
     System.out.println("Lamborgini running");
     steps+=velocity;
     Thread.sleep(acelerationTime);
    }
    }
    }

    public class ferrari implements Runnable {
    @Override
     public void run() {
     int distance = 1000;
     int steps = 0;
     int velocity = 130;
     int acelerationTime = 950;
     while (steps < distance) {
     System.out.println("Lamborgini running");
     steps+=velocity;
     Thread.sleep(acelerationTime);
    }
    }
    }

    public class RaceMain {
     public static void main(String[] args){
     lamborgini a = new lamborgini();
     lamborgini.start();

     ferrari b = new ferrari();
     ferrari.run();
    }
    }

しかし、これは正しい方法ですか?なぜ実行を使用し、なぜ開始を使用するのですか? そして、どのスレッドが最初に来るかをどうやって知ることができますか?

4

7 に答える 7

3

あなたはferrari間違った方法を使用しています。あなたはするだろう

Thread ferrariThread = new Thread(new ferrari());
ferrariThread.start();

start()両方のスレッドを編集する必要があります。現在の使用でrun()は、実際には別のスレッドで実行されていません。Thread拡張と実装の違いRunnable主にユース ケースの問題ですが、主な違いは、this内部でThreadは実行中のスレッドを参照するのに対し、Runnableでは参照しないことです。

于 2013-03-06T19:12:38.097 に答える
1

クラスは大文字で始まる名前を付けることをお勧めします。コードをフォーマットすることを忘れないでください。Eclipse や Netbeans などの IDE を使用してください。

スレッドの実行がいつ終了したか (この場合は車) を知りたい場合は、while が終了した後に println を追加するだけです。

public class Lamborgini extends Thread {

    public void run() {
        int distance = 1000;
        int steps = 0;
        int velocity = 45;
        int acelerationTime = 800;
        while (steps < distance) {
            System.out.println("Lamborgini running");
            steps += velocity;
            try {
                Thread.sleep(acelerationTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Lamborgini finished the race");
    }
}

public class Ferrari implements Runnable {
    @Override
    public void run() {
        int distance = 1000;
        int steps = 0;
        int velocity = 130;
        int acelerationTime = 950;
        while (steps < distance) {
            System.out.println("Ferrari running");
            steps += velocity;
            try {
                Thread.sleep(acelerationTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
        System.out.println("Ferrari finished the race");
    }
}

public static class RaceMain {
    public static void main(String[] args) {
        Lamborgini lamborgini = new Lamborgini();
        lamborgini.start();

        Thread ferrari = new Thread(new Ferrari());
        ferrari.start();
    }
}

Ferrari を開始する場合の正しい方法は、新しいスレッドを作成し、ランナブルであるためスレッドではない Ferrari をパラメーターとして設定することです。

于 2013-03-06T19:13:48.813 に答える
0

VmokshaのSunilkumar

スレッドを使用する場合は、1つのクラスのみを拡張する必要があります。他のビルドインクラスの機能を取得できないため、スレッドクラスを避けて実行可能なインターフェイスに移動します。インターフェイスを使用すると、他のクラスも簡単に実装できます。

于 2013-03-07T11:54:14.433 に答える
0

まず最初に、クラスにはクラス名の規則を使用してください (クラス名は大文字で始まります)

あなたの質問に答えるために。を拡張するときは、オブジェクトでメソッドをThread呼び出すだけです。そのオブジェクトはstart()からメソッドを継承するThreadため、そのオブジェクトはスレッド自体です。

を使用しているときは、それを実装するオブジェクトでメソッドをRunnable呼び出しません。代わりに、実装するオブジェクトを新しいオブジェクトにrun()渡す必要があります。例えば:RunnableThread

ferrari b = new ferrari();
Thread t = new Thread(b);
t.start();

このようにしてrun()、実装するオブジェクトのメソッドRunnableが実行されます。

于 2013-03-06T19:14:59.863 に答える
0
lamborgini a = new lamborgini();
 lamborgini.start();

このコード ブロックでは、run()ランボルギーニ (実際には大文字で始まる必要があります) 内でメソッドを非同期的に開始しています。つまり、それを開始したスレッドと並行して実行されます。

 ferrari b = new ferrari();
 ferrari.run();

これは新しいスレッドを開始しません。メソッドにジャンプするだけでrun()、メソッドが終了するまですべてのプログラムの実行が停止しrun()ます。

于 2013-03-06T19:11:59.097 に答える
0

Runnable インターフェースを実装することをお勧めします。ここでは、スレッドの動作を変更しないように何かを実行することに集中しています。

于 2013-03-06T19:12:36.543 に答える
0

クラス Thread とインターフェース Runnable の違いについて、いくつかの考えを次に示します。

1)Javaでは、クラスは1つのクラスを継承できません。つまり、1つのクラスしか拡張できません。したがって、Thread クラスを拡張すると、継承がなくなります。

2) Thread に新しい機能を追加しない場合は、Runnable を使用します。

3) Runnable はタスクを表し、Thread または Executor のいずれかによって実行できます。

4) 実行可能なスレッドが再利用可能になった後、スレッドを再開することはできません。

6) Run のみを実装する必要がある場合は、スレッドからすべてを継承する必要はありません。

7)スレッドを拡張すると、単一のオブジェクトに関連付けられた一意のオブジェクトが作成されますが、Runnable を実装すると、同じオブジェクトが複数のスレッドで共有されます。

スレッドは設定した順序で開始されますが、オペレーティング システムがいつ 2 つのスレッドを切り替えるかを知る方法はありません。

于 2013-03-06T19:42:05.963 に答える