2013-05-28 23 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