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 个冰淇淋(即同时创建 10 个 ThreadIceCream 类的实例)并且我想使用 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 回答