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

时间:2015-08-20 18:34:29

标签: java multithreading selenium-webdriver

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

((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();
  }
}

2 个答案:

答案 0 :(得分:1)

只需将它们包装在同一对象的同步块中即可。

如果你想确保一条特定的行不能与另一条行同时执行,那么就让它们在一个锁上阻塞。请参阅:Intrinsic Locks and Synchronization

以下是您修改后的代码:

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();
  }
}

答案 1 :(得分:0)

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

在ExecutorService上调用invokeAll(),传入Callable对象。这将返回一个期货清单。在你的主线程上,遍历这些Future对象,调用get()来获取你的FireFoxDriver,然后在驱动程序上调用print()。

您的Callable正文如下:

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