运行2个线程并显示最佳结果

时间:2018-03-13 20:40:00

标签: java multithreading user-interface jframe

我在旅行推销员解决方案上工作,我试图让它在两个线程中执行并返回路径图(Jframe)和最佳搜索的路径距离/输出。

我的代码如下:

  Executer myRunnable = new Executer();
    Thread t = new Thread(myRunnable);
    t.start();
    t.join();
    int tdist=(Executer.returnPathValue());
    int []comparet = returnSearchedPath();

    Thread t1 = new Thread(myRunnable);
    t1.start();
    t1.join();

    int t1dist=(Executer.returnPathValue());
    int []comparet2 = returnSearchedPath();

    if(tdist<t1dist){
        printPath(comparet);
        System.out.println(tdist);
    }
    else{
        printPath(comparet2);
        System.out.println(t1dist);
    }

此输出是

SEARCH COMMENCING:
32 10 51 13 12 26 24 23 47 45 15 49 19 29 28 46 25 27 11 50 3 43 22 20 41 1 6 16 2 17 30 21 0 48 31 44 18 40 7 8 9 14 5 4 37 36 33 34 35 38 39 42 32->dist 8904

我唯一的问题是在不使用.join()的情况下完成相同的结果并让线程同时运行。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

基本上,您需要一个线程的ArrayList和一个变量来保存当前的最佳路径。在线程类中,您需要两个Synchronized方法。同步方法是线程安全的方法。这意味着如果您运行多个线程,则可以安全地更改另一个线程中的数据。如果您想了解更多有关其工作原理的信息,请访问此链接MetaQuestionnaire。如果线程找到的路径小于当前最佳路由,则需要一种方法来更新当前最佳路由,并且在完成时需要一个函数将其自身从主线程中的ArrayList中移除。这意味着你将在主线程中有一个阻塞的while循环,它看起来像这样:

//Where threads is the ArrayList of all of your threads
while(!threads.isempty()){
    //Wait here
}

然后在结束之后你可以检查当前最佳路径变量,这应该是最好的路径变量。现在您不必等待它跳出while循环来更新JFrame。您可以在当前最佳值与当前JFrame在while循环中显示的内容不匹配时更改JFrame,但是一旦您离开,您应该仔细检查是否显示了正确的JFrame。退出表示所有线程都已完成,因此最终答案将是当前最佳路径中剩余的任何内容。

答案 1 :(得分:0)

  

我是否必须等待他们两个完成基本上我想要完成我没有使用的相同结果.join

我想我明白了。有些技术可以让您从线程获取输出而无需专门等待。基本技术是生产者 - 消费者模式。

https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem

这是在Java中执行此操作的简单方法。首先,创建一个全局线程安全队列。

public class Global {

  public static final ConcurrentLinkedQueue outputQueue = new ConcurrentLinkedQueue();

}

然后将此队列传递给您想要的任何线程。使用此队列来保存该线程的输出。

public class MyTask implements Runnable {

  private final Queue output;

  /** 'q' must be thread safe */
  public MyTask( Queue q ) {
    output = q;
  }

  @Override
  public void run() {

    // do stuff

    int [] path = ...
    output.add( path );
  }

}

现在您可以只读取队列以获取输出,或者决定不读取它。您还可以将一个线程专用于输出,并让主线程执行其他操作。 (这通常是在生产者 - 消费者问题中完成的。)您也可以生成输出但不能完成,并继续生成结果并将其添加到队列中,因为您可以计算它们。这适用于渐进式问题。

此代码未经过测试,对于使用原始类型感到遗憾,这只是一个简单的示例。

相关问题