Java 如何同时执行两个方法以确保没有延迟?

Java 如何同时执行两个方法以确保没有延迟?,java,multithreading,simultaneous,Java,Multithreading,Simultaneous,我有一个控制USB机器人的方法botMovement()。使用ArrayList中的参数值/项调用它两次,如下所示: for (BOTx1 aBot : theBotAL) { // theBotAL contains the BOTs DataType botMovement(aBot); } 我希望两个方法/功能同时执行,这样一个机器人(USB机器人)就不会在另一个机器人之前移动 我知道for循环逐元素迭代,因此不适合同时执行,因此尝试了以下操作: botMovement(the

我有一个控制USB机器人的方法
botMovement()
。使用
ArrayList
中的参数值/项调用它两次,如下所示:

for (BOTx1 aBot : theBotAL) { // theBotAL contains the BOTs DataType
    botMovement(aBot);
} 
我希望两个方法/功能同时执行,这样一个机器人(USB机器人)就不会在另一个机器人之前移动

我知道for循环逐元素迭代,因此不适合同时执行,因此尝试了以下操作:

botMovement(theBotAL.get(0)); botMovement(theBotAL.get(1));
然而,虽然延误较少,但据我所知,这也会造成轻微延误


因此,我想知道是否有一种方法可以同时调用这两个方法,从而同步bot移动

第一个问题是,您正在从一个线程调用botMovement(如果botMovement没有在内部创建线程),因此它们不是同时运行,而是按顺序运行

最好是两个创建2个线程来等待闩锁,当您调用countDown()时,它们将被通知开始

      // CREAT COUNT DOWN LATCH
        CountDownLatch latch = new CountDownLatch(1);

   //create two threads:
        Thread thread1 = new Thread(() -> {
          try {
            //will wait until you call countDown
            latch.await();
           botMovement(theBotAL.get(0))

          } catch(InterruptedException e) {
            e.printStackTrace();
          }
        });

        Thread thread2 = new Thread(() -> {
          try {
            //will wait until you call countDown
            latch.await();
           botMovement(theBotAL.get(1))
          } catch(InterruptedException e) {
            e.printStackTrace();
          }
        });

    //start the threads
        thread1.start();
        thread2.start();
    //threads are waiting

    //decrease the count, and they will be notify to call the botMovement method
     latch.countDown();

第一个问题是,您正在从一个线程调用botMovement(如果botMovement没有在内部创建线程),因此它们不是同时运行,而是顺序运行

最好是两个创建2个线程来等待闩锁,当您调用countDown()时,它们将被通知开始

      // CREAT COUNT DOWN LATCH
        CountDownLatch latch = new CountDownLatch(1);

   //create two threads:
        Thread thread1 = new Thread(() -> {
          try {
            //will wait until you call countDown
            latch.await();
           botMovement(theBotAL.get(0))

          } catch(InterruptedException e) {
            e.printStackTrace();
          }
        });

        Thread thread2 = new Thread(() -> {
          try {
            //will wait until you call countDown
            latch.await();
           botMovement(theBotAL.get(1))
          } catch(InterruptedException e) {
            e.printStackTrace();
          }
        });

    //start the threads
        thread1.start();
        thread2.start();
    //threads are waiting

    //decrease the count, and they will be notify to call the botMovement method
     latch.countDown();

你真的观察到了延迟吗?@shmosel是一个非常小的延迟。每个bot“可以”由一个单独的线程控制,但是,仍然不能保证这些方法会被同时调用,即使使用信号量或目标定时执行(所以它们会在指定的时间后运行)@MadProgrammer好的,谢谢。如何使用单独的线程控制每个机器人?@LearningToPython首先,您需要定义“如何”停止每个线程,直到您希望它们运行为止。也许从你是否真的观察到延迟开始?@shmosel是一个非常小的延迟。每个机器人“可以”由一个单独的线程控制,但是,仍然不能保证这些方法会被同时调用,即使使用信号量或目标定时执行(因此它们会在指定的时间后运行)@MadProgrammer好的,谢谢。如何使用单独的线程控制每个机器人?@LearningToPython首先,您需要定义“如何”停止每个线程,直到您希望它们运行为止。也许从一般开始,不可能在保证的情况下实现OP的要求,但这可能是最好的选择。太好了,谢谢。所以我必须为每一位创建一个新线程?这取决于你的用例,如果你没有太多的移动,那么创建新线程是可以的,但是如果你有太多的移动,那么你应该重用线程,但是,您必须以某种方式将任务发送到线程。通常,在保证的情况下,不可能实现OP要求的任务,但这可能是最好的选择。太好了,谢谢。所以我必须为每一位创建一个新线程?这取决于您的用例,如果您没有太多的移动,那么创建新线程是可以的,但是如果您有太多的移动,那么您应该重用线程,但是您必须以某种方式将任务发送到线程。