2011-04-17 59 views
-2

我希望「runnable」以5tps運行。這不是平行執行的。java中的多線程

package tt; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.FileWriter; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.ArrayList; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class mySpawner { 

public int tillDone = 0; 
public int tillMax = 0; 
public ArrayList arrayList; 
private myWorker myworking; 
private ScheduledExecutorService service = Executors.newScheduledThreadPool(50); 

Runnable runnable = new Runnable() { 

    @Override 
    public void run() { 
     try { 
      System.out.println(System.nanoTime()); 
      Thread.sleep(7000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(mySpawner.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
}; 


public void activate() { 
    try { 
     service = Executors.newScheduledThreadPool(50); 
     service.scheduleAtFixedRate(runnable, 0, 200, TimeUnit.MILLISECONDS); 
    } catch (Exception e) {//Catch exception if any 
     System.err.println("Error: " + e.getMessage()); 
    } 

} 

public void deactivate() { 
    service.shutdown(); 
} 

}

+0

問題是? – dcousens 2011-04-17 08:46:47

+0

不是說它會解決問題,但是你在代碼 – obfuscation 2011-04-17 09:12:21

+0

中初始化'service'兩次,問題是它每7秒只能打印一次納米數。不應該每200毫秒打印一次? – user557348 2011-04-17 09:39:04

回答

-1

更新:霍華德是對的,我的第一個例子是錯的。

我驗證,如果你改變你的active()方法,這個工程:

service = Executors.newScheduledThreadPool(50); 
new Thread() { 
    public void run() { 
     long nextTime = System.currentTimeMillis(); 
     while (true) { 
      service.submit(runnable); 
      long waitTime = nextTime - System.currentTimeMillis(); 
      Thread.sleep(Math.max(0, waitTime)); 
      nextTime += 200; 
     } 
    } 
}.start(); 
+0

thanx whitefang。這將運行@ 5 tps ryt? – user557348 2011-04-17 09:53:51

+0

這是在做一些完全不同的事情。它每啓動50個線程,每200毫秒運行一次。因此在200ms之後它將執行第一個和第二個。在400ms後它將同時運行三次,依此類推。它只是不顯示,因爲每個人都需要7秒,並且在動作結束之前線程不會重新生成。 – Howard 2011-04-17 10:12:12

+0

@霍華德:謝謝,我更新了一個更好的答案,我驗證了很長一段時間每秒5次。 – WhiteFang34 2011-04-17 10:44:47

3

考慮一下:

  • 你的任務在執行過程中睡7秒
  • 你安排新的任務每200ms
  • 你只有50個線程在你的執行人

我希望,應該很清楚,您將在幾秒鐘內用完合併線程,而且會失去並行性。您需要通過降低比率或減少睡眠來更好地平衡這一點。增加池大小將無濟於事,你仍然會用盡線程。

+0

我把睡眠放在那裏模擬一個運行7秒的任務。現在它沒有平行運行這個問題(它打印nanotime和7秒後打印下一個nanotime我的懷疑是不會他們打印每200毫秒?) – user557348 2011-04-17 09:06:32

+0

@ user5574348 - 注意什麼@skaffman實際上說...並做一些算術。 – 2011-04-17 09:54:55

1

scheduleAtFixedRate沒有隻產卵一個線程,但執行提供固定利率的可運行。

  • 該動作的運行時間少於給定的時間段:在這種情況下,它會按指定的週期重新生成。
  • 動作運行時間更長(您的情況):動作立即重新開始。

如果你想擁有你可以使用下面的模式所需的行爲:只需執行可運行一次:

service.schedule(runnable, 0, TimeUnit.MILLISECONDS); 

但可運行的run方法內通過

service.schedule(runnable, 200, TimeUnit.MILLISECONDS); 
添加下一個invokation

儘管如此,請考慮skaffman的答案中描述的算法。