多线程通信(java)

时间:2011-08-26 20:53:33

标签: java multithreading swing

我正在撰写标准迷宫求解算法和基于神经网络的迷宫求解算法的分析。我创建了7个类(现在),每个迷宫求解算法一个。在我的主类中,我初始化每个算法对象,为每个算法对象创建一个线程,并使它们解决生成的迷宫。每个算法基本上由一个主循环和内部部分组成。在每个循环结束时,我有一个代码段,记录我的分析所需的信息(时间,步数,转数等)。在每个算法线程完成之后,我调用一个函数,该函数获取每个算法对象并创建一个已解决的迷宫的png。然后我只是将这张图片加载到一个窗口中。

这样可以正常工作,但是对于现场演示,我希望图像能够针对每个循环周期进行更新,以便我可以实时显示迷宫。为此,我需要每个线程在它们记录信息的部分的循环中停止,直到主线程调用创建png的函数。我不确定如何使这种通信发生,因为所有算法都在不同的时间完成一个循环周期。

这是我目前在我的主要功能中的代码:

DepthFirst generator = new DepthFirst(30); // Generates the maze to be solved
byte[][] hi = generator.generate();

JFrame frame = new JFrame("DepthFirstTrial0"); // Creates the window to 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // display the finished maze

MazeSolver mazes[] = new MazeSolver[7]; // Creates each of the algorithms
mazes[0] = new RandomMouse(hi); // They are all subclasses of MazeSolver
mazes[1] = new LeftHandFollower(hi);
mazes[2] = new RightHandFollower(hi);
mazes[3] = new Pledge(hi);
mazes[4] = new Tremaux(hi);
mazes[5] = new RecursiveBacktracker(hi);
mazes[6] = new DeadEndFiller(hi);

Thread mazeThreads[] = new Thread[7];
for(int i = 0; i < 7; i++) {
mazeThreads[i] = new Thread(mazes[i]); // Puts each one in a threaad
}

for(int i = 0; i < 7; i++) {
mazeThreads[i].start(); // Starts each thread
}

Thread.sleep(1000) // Waits at most one second for them to finish

MazeSolver.toPng(mazes, 0, "DepthFirst"); // Creates the png
frame.getContentPane().add(new MazeAlgorithmAnalyzer.loadImage()); // Loads into the window
frame.pack();
frame.setVisible(true);

非常感谢任何帮助。 提前致谢! 阿斯温

3 个答案:

答案 0 :(得分:2)

使用SwingWorker。每次中间结果出现时,让你的迷宫解决algortihm调用publish()方法。之后的某个时间,在EDT上调用process()方法,您可以在其中更新显示。

答案 1 :(得分:2)

您需要CyclicBarrier

在每个迷宫解算器的每个线程中,在每个步骤之后添加行

cyclicBarrier.await();

他们将在那一行等待,直到所有其他线程都在那一点,然后他们一起重新开始。

答案 2 :(得分:0)

我必须承认,我一直在努力了解您的确切要求,但如果您正在尝试实现基本的线程间通信,那么您可以通过wait(),notify()和notifyAll()完成此操作。以下是您可以查看这些方法的两个教程:Herehere