Java 如何在线程中一次执行一块代码?

Java 如何在线程中一次执行一块代码?,java,multithreading,selenium-webdriver,Java,Multithreading,Selenium Webdriver,我有多个线程,每个线程都有下面的语句 ((JavascriptExecutor) driver).executeScript("window.print();"); 我希望在每个线程中一次执行一条语句,因为当两个线程在采样时访问该语句时,输出不是预期的 下面是一个示例程序 public class Example { static Thread t1 = new Thread(new Runnable() { @SuppressWarnings("finally") pub

我有多个线程,每个线程都有下面的语句

((JavascriptExecutor) driver).executeScript("window.print();");
我希望在每个线程中一次执行一条语句,因为当两个线程在采样时访问该语句时,输出不是预期的

下面是一个示例程序

public class Example {
  static Thread t1 = new Thread(new Runnable() {
    @SuppressWarnings("finally")
    public void run() {
      WebDriver driver = new FirefoxDriver(prof);
      driver.get("http://www.example.com");
      ((JavascriptExecutor) driver).executeScript("window.print();");
    }
  });
  static Thread t2 = new Thread(new Runnable() {
    @SuppressWarnings("finally")
    public void run() {
      WebDriver driver = new FirefoxDriver(prof);
      driver.get("http://www.example.com");
      ((JavascriptExecutor) driver).executeScript("window.print();");
    }
  });

  public static void main(String args[]) {
    t1.start();
    t2.start();
  }
}
只需将它们包装在同一对象上的同步块中。 如果要确保某一行不能与另一行同时执行,只需将它们锁定在一个锁上即可。见:

这是您修改过的代码:

public class Example {
  // Create the lock
  static final Object lock = new Object();

  static Thread t1 = new Thread(new Runnable() {
    @SuppressWarnings("finally")
    public void run() {
      WebDriver driver = new FirefoxDriver(prof);
      driver.get("http://www.example.com");

      // synchronize on the lock
      synchronized(lock) {
        ((JavascriptExecutor) driver).executeScript("window.print();");
      }
    }
  });

  static Thread t2 = new Thread(new Runnable() {
    @SuppressWarnings("finally")
    public void run() {
      WebDriver driver = new FirefoxDriver(prof);
      driver.get("http://www.example.com");

      // synchronize on the lock
      synchronized(lock) {
        ((JavascriptExecutor) driver).executeScript("window.print();");
      }
    }
  });

  public static void main(String args[]) {
    t1.start();
    t2.start();
  }
}

他们需要按一定的顺序打印吗?如果是这样,您可能希望为后台工作人员使用
ExecutorService

在ExecutorService上调用invokeAll(),传入可调用对象。这将返回一个未来列表。在主线程上,循环这些未来对象,调用get()获取FireFoxDriver,然后在驱动程序上调用print()

您的可调用身体将如下所示:

  WebDriver driver = new FirefoxDriver(prof);
  driver.get("http://www.example.com");
  return driver;

这段代码为我工作
synchronized(lock){Thread.sleep(2000);((JavascriptExecutor)driver).executeScript(“window.print();”);}
感谢您的支持help@javadb9没有
线程,它就不能工作。sleep()
?奇怪的是,我想知道为什么。因为打印过程(不在程序范围内)需要1到2秒才能完成,而且在处理时它不能接受新的请求,这就是为什么我必须
Thread.sleep()
@javadb9,
sleep()
在这种特殊情况下可能对您有效,但一般来说,使用
sleep()
同步线程和进程是一个非常糟糕的主意。糟糕的是,当您的代码在与您测试它的环境不同的环境中运行时,您在
sleep()
调用中等待的事情可能需要不同的时间才能完成。@James非常感谢您让我知道这一点,谢谢您的时间