使用线程同时创建十个类的实例

时间:2012-09-05 05:55:01

标签: java multithreading

我试图理解Java中的线程。作为练习,我创建了如下冰淇淋课程。

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个Icecreams(即同时创建10个ThreadIceCream类的实例),我想在Java中使用线程来执行此操作。我尝试过一些东西,但他们并没有接近。

1 个答案:

答案 0 :(得分: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个线程。由于任务很小,几个任务甚至可以在同一个线程上执行,但这实际上是一件好事。