1

我对 hawtdispatch 很陌生,想运行一个示例程序来演示线程池。以下是我尝试运行的程序:

公共类 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 时,有什么方法可以知道系统在特定时间使用的线程数?调度队列的内存管理是如何完成的?

请帮忙 !!

谢谢...里查!

4

1 回答 1

4

我不知道这个 hawtdipatch 库,但这似乎是守护进程与普通线程的典型问题。

根据 java 规范,当所有非守护线程都终止时,JVM 退出。执行 main() 方法的线程是一个非守护线程,在命令行应用程序中,它也是唯一正在运行的非守护线程。您的 DispatchQueue 很可能会产生守护线程,这些线程不会使应用程序保持活动状态。

结果,JVM 在执行“queue.execute()”调用后很快退出。在 JVM 完全停止之前,DispatchQueue 中的线程可能有时间执行一些循环,但在 JVM 停止所有线程之前它没有时间完成所有 100'000 个循环。

在对 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();
}
于 2012-08-14T09:42:16.957 回答