2013-05-28 35 views
0

我正在創建一個解析和處理XML文件的程序。需要有一個在分析和處理XML文件時運行的GUI。有幾個JProgressBars,4個計數器和2個用於顯示當前文件和目錄的文本字段。在FixedThreadPool中運行預定的線程

我在解析和處理過程中正在更新GUI時遇到問題。我認爲最好的方法是創建一個newFixedThreadPool(),讓它們同時運行。問題是我想每秒更新一次GUI,但也有解析和處理不斷運行,所以看起來好像有一個ScheduledThreadPool是不可能的。

所以我的問題是,是否有可能在FixedThreadPool運行預定的線程和普通線程?如果是這樣,我該如何去做,如果沒有,如果沒有,你們中的任何人對如何解決這個問題有什麼建議嗎?

GUIThread類:

GUIThread() 
{ 
    guiThread = new Thread(this); 
    guiThread.start(); 
} 
@Override 
public void run() 
{ 
    try{ 
     checkProcessedFiles(getFilesProcessed()); 
     checkDirErrorCount(getErrorCount()); 
     checkAwardCount(getAwardCount()); 
     checkErrorCount(getErrorCount()); 
    } catch(IOException ioe){} 

} 

ProcessThread類:

ProcessThread() 
{ 
    processThread = new Thread(this); 
    processThread.start(); 
} 
@Override 
public void run() 
{ 
    try{ 
     MainGUI mGUI = new MainGUI(); 
     Migrate migrate = new Migrate(mGUI.getXMLDirectory()); 
     migrate.processDirectory(); 
    } catch(Exception e){} 
} 

主要方法:

ExecutorService es = Executors.newFixedThreadPool(2); 
es.execute(new GUIThread()); //THIS NEEDS TO BE SCHEDULED 
es.execute(new ProcessThread()); 

回答

0

信號燈 的System.Threading.Semaphore類的實例可以讓你限制同時訪問的號碼爲 到資源。你可以想象一個停車場的入口門,其中 只包含一定數量的停車位。只有當停車位有剩餘空間 時,大門纔會打開。同樣,噹噹前條目數達到某個最大數時,嘗試使用WaitOne()方法輸入信號量成爲阻塞。這個 最大條目號由Semaphore 類的構造函數的第二個參數設置。第一個參數定義了空閒條目的初始數量。如果第一個參數的值低於第二個參數的值 ,則調用構造函數的線程會自動保存由這兩個值之間的差異定義的特定數量的條目。最後一句話表明同一個 線程可以將多個條目保存到同一個信號量。 以下示例通過啓動3個線程來說明所有這些情況,這3個線程定期嘗試輸入 到最大條目數設置爲5的信號量。主線程維護 這個信號量的三個入口,強制3個線程共享剩餘的2個入口。 示例

using System; 
using System.Threading; 
class Program { 
static Semaphore semaphore; 
static void Main() { 
// Initial number of free slots : 2. 
// Maximal number of slots used simulteanously : 5. 
// Number of slot owned by the main thread : 3 (5-2). 
semaphore = new Semaphore(2, 5); 
for (int i = 0; i < 3; ++i) { 
Thread t = new Thread(WorkerProc); 
t.Name = 「Thread」 + i; 
t.Start(); 
Thread.Sleep(30); 
} 
} 
Example: 
static void WorkerProc() { 
for (int j = 0; j < 3; j++) { 
semaphore.WaitOne(); 
Console.WriteLine(Thread.CurrentThread.Name + 「: Begin」); 
Thread.Sleep(200); // Simulate a 200 milliseconds task. 
Console.WriteLine(Thread.CurrentThread.Name + 「: End」); 
semaphore.Release(); 
} 
} 
} 

這裏是程序的顯示。我們看到,永遠不會有超過2個線程 將同時工作: Thread0:開始 線程1:開始 Thread0:結​​束 線程2:開始 線程1:結束 線程1:開始 線程2:結束 線程2:開始 線程1:結束 線程1:開始 線程2:結束 線程2:開始 線程1:結束 Thread0:開始 線程2:結束 Thread0:結​​束 Thread0:開始

線程0:結束

我認爲這是可能的信號量 您可以使用8毫秒的100或200釐秒,因爲量子時間爲6毫秒。

+0

廢話,我應該指出這是在Java中。我會谷歌,看看是否有Java中的信號類 – Collin

+0

是的,你應該必須有Java中的WorkerProc(我認爲) – dewelloper