我是hawtdispatch的新手,想要运行示例程序来演示线程池。 以下是我尝试运行的程序:
public class DispatchQueueT {
public static void main(String[] args) {
DispatchQueue queue = createQueue("Your queue");
queue.execute(new Runnable()
{
public void run()
{
for (int i = 0; i < 100000; i++)
{
System.out.println("First Task"+ "time "+new Date()+" count : "+i);
}
}
});
}
}
但问题是,不是打印到控制台100000次,而是只打印700或800次,程序停止。 我不知道如何使用HawtDispatch实现这个简单的线程池。:(
此外,我需要知道一些问题的答案
使用hawtdispatch时,有什么办法可以知道系统在特定时间使用的线程数吗? 如何完成调度队列的memonry管理?
请帮助!!
Thx ...... Richa !!
答案 0 :(得分:4)
我不知道这个hawtdipatch库,但这似乎是deamon与普通线程的典型问题。
根据java规范,当所有非deamon线程终止时,JVM退出。执行main()方法的线程是非守护程序线程,在命令行应用程序中,它也是唯一运行的非守护程序线程。你的DispatchQueue最有可能产生deamon线程,它不会使应用程序保持活跃状态。
因此,JVM在执行“queue.execute()”调用后很快退出。在JVM完全停止之前,DispatchQueue中的线程可能有时间执行一些循环,但是在JVM停止所有线程之前,它没有时间完成所有100'_循环。
在HawtDispatcher的源代码中发现一些问题之后,事实证明这确实是问题所在。它位于SimplePool.createWorker()
中private SimpleThread createWorker(int index) {
SimpleThread w;
try {
w = new SimpleThread(this);
} catch (Exception e) {
throw new RuntimeException(e);
}
w.setDaemon(true); // <- That's the one that causes trouble for you
w.setPriority(priority);
w.setName(name + "-" + (index+1));
return w;
}
似乎这种行为也不容易改变,因为HawtDispatch从不允许您轻松替换自己的WorkerPool实现。
要解决您的问题,您需要等到任务完成执行,您可以通过两种不同的方式执行此操作:
1)。在queue.execute()之后添加一个Thread.sleep()调用。这很简单,但有点丑陋和脆弱。
2)。使用适当的同步工具正确等待终止任务,例如CountDownLatch
public static void main(String[] args) throws InterruptedException {
DispatchQueue queue = createQueue("Your queue");
final CountDownLatch latch = new CountDownLatch(1);
queue.execute(new Runnable(){
public void run(){
for (int i = 0; i < 100000; i++){
System.out.println("First Task"+ "time "+new Date()+" count : "+i);
}
latch.countDown();
}
});
latch.await();
}