1

Java でスレッドを理解しようとしています。演習として、次のように Ice Cream クラスを作成しました。

public class ThreadIceCream {

private String flavor = "";
private String[] specialFlavors = { "Vanilla", "Chocolate", "Butter Pecan", "Strawberry", "Chocolate Chip", "Cherry", "Coffee" };
    // Constructor for ThreadIceCream class
public ThreadIceCream() {       
    int randInt = (int) (Math.random() * specialFlavors.length);
    flavor = specialFlavors[randInt];
    System.out.println("Enjoy your " + flavor + " IceCream!");
} }

ThreadIceCream クラスは、クラスが初期化されるたびにランダムなフレーバーを持つ IceCream オブジェクトを作成する単純なクラスです。これが私が使用しているTestStubです。

public class TestStub {

public static void main(String[] args) {

    ThreadIceCream Th1 = new ThreadIceCream();
    ThreadIceCream Th2 = new ThreadIceCream();

} }

ここで、10 個の Icecream を作成 (つまり、ThreadIceCream クラスの 10 個のインスタンスを同時に作成) したいと考えており、これを行うために Java でスレッドを使用したいと考えています。私はいくつかのことを試しましたが、それらは近いものではありませんでした。

4

1 に答える 1

3

それほど難しいことではありません。

Thread[] threads = new Thread[10];
for(int i = 0; i < 10; i++) {
    threads[i] = new Thread(new Runnable() {
                    public void run() {
                        ThreadIceCream tic = new ThreadIceCream();
                    }
                 });
    threads[i].start();
}

for(int i = 0; i < 10; i++) {
    threads[i].join();
}

確かに、各スレッドによって実行される作業は非常に小さいため、スレッドを開始するためのオーバーヘッドが実際には高くなるため、これはあまり役に立ちませんが、どうでもいいことです。

また、効率を高めるためにExecutorServiceの使用方法も学習する必要があります。純粋なスレッドは重量があり、特にグループでは、何に対しても適切なソリューションになることはめったにありません。上記のExecutorServiceバージョンは次のとおりです。

ExecutorService exec = Executors.newFixedThreadPool(10);
for(int i = 0; i < 10; i++) {
    exec.submit(new Runnable() {
                    public void run() {
                        ThreadIceCream tic = new ThreadIceCream();
                    }
                });        
}

exec.shutdown();
exec.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

ここでは、10 個のスレッドのプールを作成し、10 個のタスクを送信しています。スレッドはタスクの実行間でリサイクルされるため、タスクの数に関係なく、作成されるスレッドは 10 個だけです。タスクは非常に小さいため、複数のタスクが同じスレッドで実行されることもありますが、実際にはこれは良いことです。

于 2012-09-05T06:08:04.787 に答える