我试图理解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中使用线程来执行此操作。我尝试过一些东西,但他们并没有接近。
答案 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个线程。由于任务很小,几个任务甚至可以在同一个线程上执行,但这实际上是一件好事。