【问题标题】:Running 2 threads and Displaying Best Result运行 2 个线程并显示最佳结果
【发布时间】:2018-03-13 20:39:59
【问题描述】:

我正在开发一个旅行推销员求解器,我试图让它在两个线程中执行并返回路径图(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() 的情况下完成相同的结果并让线程同时运行。有什么想法吗?

【问题讨论】:

  • 似乎您需要等待两个线程完成,然后比较结果并选择要显示的那个。你有什么问题?在您显示的代码中,您同时显示了两条路径。
  • 如何在不先显示结果的情况下运行线程?
  • 您如何定义“最佳输出”?你的意思是把总路径长度加起来吗?你的意思是一些子路径长度?我们不知道您的输出代表什么...
  • 将其保存在变量中。
  • 因为在我的线程运行方法中是输出结果的代码,当我点击开始时它会自动输出

标签: java multithreading user-interface jframe


【解决方案1】:

我是否必须等待他们两个都完成基本上我想在不使用 .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 );
  }

}

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

此代码未经测试,很抱歉使用原始类型,这只是一个简单的示例。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 令人困惑的是没有更简单的方法来解决这个问题吗?
    • 编辑:我做了一些更改,你能看看我的代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多