2014-01-27 171 views
-1

我有一个特定的需求,我想在两个线程之间进行通信。线程同步和信号

我想使用Java 1.6

让我们假设来实现这个多线程的使用情况下,我们必须确保使用无人驾驶飞机的区域。该区域可以在X轴上测量100km,在Y轴上测量100km。在这个平面上的每个乡绅公里都可以使用{x,y}坐标来定位。例如{0,1} {0,2} {0,3} {0,4} {0,5}无人驾驶飞机可以有其预定义的飞行路径(它可以是随机的,在这个平原中的任何地方),例如{0,1} {0,2} {0,4} {0,5} {0,6}。他们必须继续从{0,1}飞到{0,6}。一旦无人机到达目的地,它应该开始其旅程,例如从{0,6}到{0,1},并保持飞回来和第四,除非停止。

但是一个转折点 - 让我们说上面的飞行路径drone1从{0,1}开始,到达{0,2}。无人驾驶飞机1将保持悬停在{0,2},直到另一架无人机释放它。例如drone2具有完全不同的飞行路径,但是有一个或路径作为drone1两个共同立场,将指导drone1“你可以从这个位置释放自己,保持飞往你的路,因为我在这里获得这个位置” 。

如果你理解了使用正确的情况下,这里的问题是,线程1它已经收购了在{0,2}锁,必须等待,直到线程2指示将其释放。

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

+0

与我们分享您的解决问题的尝试。 – LorDex

+1

我不知道该怎么做。正如我在问题中提到的那样,thread1已经获得位置{0,2}上的锁定。两个线程之间唯一的碎片就是位置,我找不到同步的方式来在thread1和其他尝试获取锁的线程之间进行通信。 – Gunwant

+0

在什么语言,你应该写的吗?对于同一件事,不同的语言可能会有不同的词。 – Dialecticus

回答

0

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

public class Square(){ 

... 


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

这是一个好主意,谢谢。 – Gunwant

0

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

  • 一个线程执行其程序在while(signal)循环,并退出当信号变成false
  • 通过通信信道酷似对象,例如为ConcurrentLinkedQueue,信号发送者不断推动“任务”到队列中,而繁忙的线程不断从它拉出。只要有任务要做,忙线程将继续工作,而且只要没有更多的工作留停止。