我有多个线程,每个线程都有以下语句
((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();
}
}
答案 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;