多线程Java

时间:2014-01-27 04:57:34

标签: java multithreading performance processing

在我的程序中,我基本上有一个类似的方法:

for (int x=0; x<numberofimagesinmyfolder; x++){
    for(int y=0; y<numberofimagesinmyfolder; y++){
        compare(imagex,imagey);
        if(match==true){
            System.out.println("image x matches image y");
        }
    }
}

所以基本上我有一个图像文件夹,我比较了图像的所有组合......所以将图像1与所有图像进行比较,然后比较图像2 ...依此类推。我的问题是在搜索什么图像匹配时,需要很长时间。我试图多线程这个过程。有没有人知道如何做到这一点?

2 个答案:

答案 0 :(得分:8)

不是每次都比较图像,而是散列图像,保存散列,然后比较每对消息的散列。由于哈希值要小得多,因此可以更加适合内存和缓存,这样可以大大加快比较速度。

也许有一种更好的方法来搜索相等性,但是一种选择是将所有哈希值粘贴到数组中,然后按哈希值对它们进行排序。然后迭代列表,查找相等的相邻条目。这应该是O(n*log(n))而不是O(n^2),就像您当前的版本一样。

答案 1 :(得分:3)

  1. 内循环应该从y = x + 1开始,以利用对称性。
  2. 首先将所有图像加载到内存中。不要从磁盘进行全部比较。
  3. 使用Java ExecutorService(基本上是一个线程池)。所有索引组合的队列任务。让线程将索引组合从任务队列中拉出并执行比较。
  4. 以下是执行多线程的一些通用代码:

    public static class CompareTask implements Runnable {
        CountDownLatch completion;
        Object imgA;
        Object imgB;
    
        public CompareTask(CountDownLatch completion, Object imgA, Object imgB) {
            this.completion = completion;
            this.imgA = imgA;
            this.imgB = imgB;
        }
    
        @Override
        public void run() {
            // TODO: Do computation...
    
            try {
                System.out.println("Thread simulating task start.");
                Thread.sleep(500);
                System.out.println("Thread simulating task done.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            completion.countDown();
        }
    }
    
    public static void main(String[] args) throws Exception {
        Object[] images = new Object[10];
    
        ExecutorService es = Executors.newFixedThreadPool(5);
    
        CountDownLatch completion = new CountDownLatch(images.length * (images.length - 1) / 2);
    
        for (int i = 0; i < images.length; i++) {
            for (int j = i + 1; j < images.length; j++) {
                es.submit(new CompareTask(completion, images[i], images[j]));
            }
        }
    
        System.out.println("Submitted tasks. Waiting...");
        completion.await();
        System.out.println("Done");
    
        es.shutdown();
    }