2013-01-15 15 views
2

我需要做的是使用大小爲3的FixedThreadPool,然後用它來打印ThreadName,然後讓它在指定的時間間隔內隨機休眠一段時間,並打印它醒來當它完成時。我需要通過線程來完成,但是我的輸出將與所有3個線程一起完成。FixedThreadPool

希望的輸出: 池-1-線程1進入休眠狀態爲800毫秒和1000毫秒之間

時間間隔的隨機量

池-1-線程1進行睡

池-1-線程2臨睡前爲800毫秒和1000毫秒

之間的時間間隔的隨機量

池-1-線程2完成睡眠

池-1-線程3睡覺時間間隔的隨機量在800毫秒和1000毫秒之間

池1線程3做睡

我需要使用FixedThreadPool只

import java.util.Random; 
import java.util.concurrent.*; 

class Sleep implements Runnable 
{ 
public void run() 
    { 
    Random ran = new Random(); 
    int randomnumber = ran.nextInt(1000-800+1)+800; 
    System.out.print(Thread.currentThread().getName()+" "); 
    System.out.println("Going to sleep for random amount of time interval between 800 ms and 1000ms"); 
    try 
    { 
     Thread.sleep(randomnumber); 

    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    System.out.println(Thread.currentThread().getName()+" done sleeping"); 
    Thread.yield(); 
} 
} 

public class Ch6Ex3 
{ 
    public static void main(String[] args) 
    { 
    ExecutorService exe = Executors.newFixedThreadPool(3); 
    for(int i=0;i<3;i++) 
    { 
     exe.execute(new Sleep()); 
    } 
    exe.shutdown(); 
    } 
} 
+2

當您需要它們以完全順序執行時,多線程的要點是什麼? –

+2

如果你需要通過線程來完成它 - 你應該使用'newSingleThreadExecutor'來代替3線程池。 –

+0

給我們提供了期望和實際產出的例子 –

回答

1

只有1線程創建的線程池。如果你使用3個線程,那麼可以同時運行多達3個runnable,這不是你想要的。因此,使用:

ExecutorService exe = Executors.newFixedThreadPool(1); 

其實更好的選擇將是使用newSingleThreadExecutor,因爲它明確地表明,它只能運行1可運行在任何特定時間:

ExecutorService exe = Executors.newSingleThreadExecutor(); 

內部兩種方法創建ThreadPoolExecutor 1線程,以便有他們之間沒有實際的區別,只是在命名上。

1

如果您正在創建的對象彼此後立即(同毫秒內),他們」在他們的隨機實例中可能會有相同的種子 - 因此他們會睡相同的時間。

,通過javadoc:

Creates a new random number generator. Its seed is initialized to a value based on the current time: 
public Random() { this(System.currentTimeMillis()); } 
Two Random objects created within the same millisecond will have the same sequence of random numbers. 
+0

不錯,我不知道這個。是否有另一種方法可以在同一毫秒內創建不同的PRNG? –

+0

你在看什麼Java版本?這不是它在新版本中的工作原理。在更新的版本中,即使創建相同的納秒,種子也是獨一無二的。 –

0

除此之外還有在你的代碼中的問題。

Thread.yield(); 

是多餘的。

如果需要逐個執行,則不需要線程池。您可以從for循環中調用Sleep#run來創建Sleep類的不同實例。

相關問題