【问题标题】:Java Threads - How to make hough transform run faster [duplicate]Java线程-如何使霍夫变换运行得更快[重复]
【发布时间】:2015-01-12 04:40:17
【问题描述】:

我正在尝试在 Java 中实现霍夫变换以查找图像中的所有行。由于该过程本身花费了太多时间,因此我决定将其分散到多个线程中。然而,在这样做之后,这个过程并没有变得更快。我究竟做错了什么? for 循环在每次迭代中等待 input_elements 完成的原因是什么?

for循环

    latch = new CountDownLatch(thread_arr.length);
    for (int i=0; i<border_que.arr.length; i++) {
        thread_arr[i].input_elements(border_que.arr[i][0], border_que.arr[i][1]);
    }

    try {
        latch.await();
    } catch (Exception e) {System.out.println(e.getCause());}

线程代码

class RowAndThetaThread implements Runnable{
    private int x_0;
    private int y_0;

    public void run() {
        // find rho and theta and push them to an array
    }

    public void input_elements(int x, int y) {
        x_0 = x;
        y_0 = y;

        this.run();
    }

}

【问题讨论】:

    标签: java android multithreading hough-transform


    【解决方案1】:

    您实际上并没有使用多个线程。

    Thread 对象并不特殊。当您调用一个方法时,包括run,该方法仍然在当前线程上执行。

    有一个start 方法,它(在任何现有线程上调用时)在新线程上调用run。这是在 Java 中启动新线程的唯一方法。

    【讨论】:

    • 如何从input_elements 方法内部调用start?执行this.start()RowAndThetaThread.start() 不起作用。
    • ...我应该注意到你甚至没有使用Thread。 (当您的代码与线程无关时,您希望它如何工作?)。简单的创可贴修复:将implements Runnable 更改为extends Thread。 (这不是一个很好的做法,因为通常您希望拥有固定数量的线程以获得最佳性能,但这是另一个问题)
    • @immibis 通常你不应该扩展Thread,只需将Runnable 提供给一个新的Thread(或更好:执行器服务)
    【解决方案2】:

    你可以这样尝试,不用上课:

    latch = new CountDownLatch(thread_arr.length);
    for (int i=0; i<border_que.arr.length; i++) 
      {
    
         //added
         static int x = border_que.arr[i][0];
         static int y = border_que.arr[i][1];
    
        Thread thread = new Thread(new Runnable(){
            @Override
            public void run() {
                try {
    
                        //thread action here
    
                          int x_0 =x;
                          int y_0 =y;
    
                    } catch (Exception e) {
                        //report thread exeception etc
                    }
            }
        });
    
      thread.start();
      //end added
    
    }
    
    try {
        latch.await();
    } catch (Exception e) {System.out.println(e.getCause());}
    

    【讨论】:

      猜你喜欢
      • 2014-03-20
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      相关资源
      最近更新 更多