线程同步和信令

时间:2014-01-27 12:27:52

标签: java multithreading

我有一个特定的要求,我希望在两个线程之间进行通信。

我想使用Java 1.6实现这个多线程用例

让我们假设,我们必须使用无人驾驶飞机来保护区域。该区域可在X轴上测量100km,在Y轴上测量100km。可以使用{x,y}坐标来定位该平面中的每个乡绅km。

无人机可以拥有预定义的飞行路径(它可以是随机的,在这个平原的任何地方),例如{0,1} {0,2} {0,3} {0,4} {0,5} { 0,6}。他们必须保持从{0,1}飞到{0,6}。一旦无人机到达目的地,它应该开始返回旅程,例如从{0,6}到{0,1}并继续向后飞行,除非停止。

但有一个转折 - 让我们说在上面的飞行路径drone1从{0,1}开始到达{0,2}。 drone1将继续在{0,2}处徘徊,直到另一架无人机释放它。例如,无人驾驶飞机2具有完全不同的飞行路径,但在路径上有一个或两个常见位置,就像无人机1一样,将指示无人机1“你可以从这个位置释放自己并继续飞向你的路径,因为我来这里获取这个位置”

如果您已正确理解用例,那么问题是,已经获得{0,2}锁定的thread1必须等到thread2指示释放它。

我们如何做到这一点,如何将消息发送到另一个线程并等到位置为空?

2 个答案:

答案 0 :(得分:0)

线程间信令有两种常见的方法:

  • 线程在while(signal)循环中执行其例程,并在信号变为false
  • 时退出
  • 通过类似通信通道的对象,例如ConcurrentLinkedQueue,信号发送器不断将“任务”推入队列,并且忙线程继续从中拉出。只要有任务要做,繁忙的线程就会继续工作,只要不再有工作就会停止。

答案 1 :(得分:0)

这是使用wait()和notify()的经典示例。一旦无人机到达目的地,它就会进入一个等待的块()。这将释放同步块上的锁定。一旦无人机2到达,它就会调用notify()。这会唤醒无人机1。

public class Square(){

...


public void arriveOnSquare(){
    notify();
    ...
    synchronized(this){
        wait();
    }
    ...
}
}