2012-09-05 80 views
1

我想了解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類是一個簡單的類,它使用一個隨機的味道創建一個冰激凌對象每類初始化時間。這是我正在使用的TestStub。

public class TestStub { 

public static void main(String[] args) { 

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

} } 

現在我想創建10個冰淇淋(即同時創建ThreadIceCream類的10個實例),我想使用Java線程來做到這一點。我嘗試了一些東西,但他們沒有接近。

+1

有沒有聽說過循環?順便說一句,爲什麼你需要線程? –

+0

我知道循環會一個接一個地創建10個實例。我想用線程來學習線程是如何工作的,並開始使用簡單的例子來更好地理解。 –

+2

[谷歌是你的朋友。](https://www.google.com/search?q=java+threads+tutorial) – verdesmarald

回答

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個線程。由於任務非常小,幾個任務甚至可以在同一個線程上執行,但這實際上是一件好事。

+0

感謝都鐸王朝,我也在博客上閱讀了一些文章。我現在得到一個竅門。我會嘗試一下,看看我能否把它做好。感謝您的迴應! –

相關問題