hawtdispatch:一个简单的线程池示例

时间:2012-07-31 06:04:49

标签: java concurrency

我是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 !!

1 个答案:

答案 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();
}