4

私はスレッドを作成するコードを開発していましたが、スレッドクラスを拡張したり、実行可能なインターフェイスを実装したりせずに、匿名の内部クラスを使用しています..

public class Mythread3 {
    public static void main(String... a) {

        Thread th = new Thread() {

            public synchronized void run() {
                for (int i = 0; i < 20; i++) {
                    try {
                        Thread.sleep(1000);

                        System.out.print(i + "\n" + "..");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }

        };

        th.start();
        Thread y = new Thread();
        y.start();

    }
}

同じアプローチで子スレッドを作成することもできます..!! 私が試したことは...

public class Mythread3 {
    public static void main(String... a) {

        Thread th = new Thread() {

            public synchronized void run() {
                for (int i = 0; i < 20; i++) {
                    try {
                        Thread.sleep(1000);

                        System.out.print(i + "\n" + "..");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }

        };

        Thread th1 = new Thread() {

            public synchronized void run() {
                for (int i = 0; i < 20; i++) {
                    try {
                        Thread.sleep(1000);

                        System.out.print(i + "\n" + "..");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }

        };
        th.start();
        try {
            th.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        th1.start();

    }
}

しかし、そこには 2 つの run() メソッドがあります。これは実用的ではないと思います..アドバイスしてください..!

4

3 に答える 3

10
 Runnable run = new Runnable() {
    public void run() {
        try {
            for (int i = 0; i < 20; i++) {
                Thread.sleep(1000);
                System.out.print(i + "\n" + "..");
            }

        } catch (InterruptedException e) {
            System.out.println(" interrupted");
        }
    }
 };
 new Thread(run).start();
 new Thread(run).start();

2 番目のスレッドを開始する前に 1 つのスレッドが終了するのを待たないでください。または、1 つのスレッドが実行されているスレッドが 3 つある場合 (この場合、追加のスレッドは無意味です)

ところで:あなたの同期は何も役に立ちませんが、スレッドが正しく機能しない可能性があります。


于 2012-04-17T07:10:18.443 に答える
1

Thread を拡張し、run() メソッドをオーバーライドする 2 つの匿名内部クラスを宣言すること自体は問題ではありません。あまり読めないと思われるかもしれませんが、問題ありません。

ただし、Runnableインターフェイスの使用を検討する必要があります。処理/アルゴリズムとスレッド化ポリシーを分離する必要があります。したがって、次のようなものがあるとよいでしょう。

public class ThreadLauncher {
    public static void main(String[] args) {
         Thread job1 = new Thread(new Job1());
         Thread job2 = new Thread(new Job2());
         job1.start();
         job2.start();
    }
}

public class Job1 implements Runnable {
    @Override
    public void run() {
         // Do some stuff
    }
}

public class Job2 implements Runnable {
    @Override
    public void run() {
         // Do some other stuff
    }
}

これにより、たとえば、同じジョブを複数回起動できます。

さらに一歩進めたい場合は、 を使用ThreadPoolExecutorしてスレッド化戦略を処理することを検討できます。

于 2012-04-17T07:16:38.357 に答える