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非常感谢您让我知道这一点,谢谢您的时间