Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程同步和信令_Java_Multithreading - Fatal编程技术网

Java 线程同步和信令

Java 线程同步和信令,java,multithreading,Java,Multithreading,我有一个特殊的要求,我想在两个线程之间进行通信 我想用Java1.6实现这个多线程用例 让我们假设,我们必须使用无人驾驶飞机保护一个地区。该区域可以在X轴上以100km为单位进行测量,在Y轴上以100km为单位进行测量。这个平面上的每一个乡绅公里都可以用{x,y}坐标定位 无人机可以有其预定义的飞行路径(可以是随机的,在这个平原的任何地方),例如{0,1}{0,2}{0,3}{0,4}{0,5}{0,6}。他们必须继续从{0,1}飞到{0,6}。一旦无人机到达目的地,它应该开始返回,例如从{0,

我有一个特殊的要求,我想在两个线程之间进行通信

我想用Java1.6实现这个多线程用例

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

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

但有一个转折点——让我们假设在上面的飞行路径中,无人机1从{0,1}开始,到达{0,2}。无人机1将继续在{0,2}处盘旋,直到另一架无人机释放它。例如,无人机2具有完全不同的飞行路径,但在路径中有一个或两个与无人机1相同的位置,将指示无人机1“您可以从该位置释放自己并继续飞行到您的路径,因为我是来获取该位置的”

如果您正确理解了用例,这里的问题是,已经获得了{0,2}上的锁的thread1必须等待thread2指示释放它


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

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

  • 线程在
    while(signal)
    循环中执行其例程,并在信号变为
    false时退出
  • 通过类似于通信通道的对象,例如
    ConcurrentLinkedQueue
    ,信号发送方不断地将“任务”推送到队列中,而忙碌的线程不断地从队列中退出。只要有任务要做,忙碌的线程就会继续工作,一旦没有更多的工作剩下,它就会停止

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

public class Square(){

...


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

与我们分享您解决问题的尝试。我不知道该怎么办。正如我在问题部分中所说的,thread1已经获得了位置{0,2}上的锁。两个线程之间唯一的分歧是位置,我找不到在thread1和另一个试图获取锁的线程之间进行通信的同步方式。您应该用什么语言编写这个?不同的语言可能对同一事物有不同的词。对不起,我之前没有指定语言,我想用Java 1.6(也更新了问题语句)实现这一点,因此线程/无人机正在以自己的速度更改其位置,但在被要求时也被迫更改位置?