当前位置: 首页 > 知识库问答 >
问题:

如何使我的方法在继续之前等待文件存在

范弘亮
2023-03-14

有一个创建XML文件的外部程序,但创建可能需要一段时间。我需要我的Java程序等到文件存在后再继续。

我读了一些关于同步块的书,我读到我可以做这样的事情:

synchronized(this) {
    while (!file.exists) { this.wait(); }
}

老实说,我对同步任务知之甚少,所以我想知道我是否在正确的轨道上,或者我是否偏离了轨道。

共有3个答案

周滨海
2023-03-14

在我看来,你应该有一些东西来通知线程。下面是我的例子。

public class Test {
File file;
public Test(File file){
    this.file = file;
}

public void findFile(){
    synchronized(this){
        while(!file.exists()){
            try {
                System.out.println("before wait:");
                this.wait();
                System.out.println("after wait:");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public void createFile(){
    synchronized(this){
        try {
            System.out.println("before create a new file:");
            file.createNewFile();
            System.out.println("after create a new file:");
            this.notify();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args){ 
    Test t = new Test(new File("/Users/yehuizhang/Desktop/uttp.txt"));
    Thread t1 = new Thread(new FindFile(t));
    Thread t2 = new Thread(new CreateFile(t));
    t1.start();
    t2.start();
}
}

class FindFile implements Runnable{
Test t;
public FindFile(Test t){
    this.t = t;
}

@Override
public void run(){
    t.findFile();
}
}

class CreateFile implements Runnable{
Test t;

public CreateFile(Test t){
    this.t = t;
}

@Override
public void run(){
    t.createFile();
}
}
漆雕原
2023-03-14

所以我用了一个while循环来检查文件是否存在。如果不行,我就让线睡上一秒钟。它似乎工作正常。谢谢你的帮助。

羊昊苍
2023-03-14

解决这个问题的典型方法是让您的XML编写器创建XML文件,完成后,它应该创建第二个文件,说明工作已经完成。

您的java程序应该侦听. do文件而不是XML文件的存在。

但是,如果您对XML编写应用程序没有任何控制权,它将无法工作。

 类似资料:
  • 问题内容: 我正在尝试在Node.js / Express中创建一个路由,该路由从两个查询中读取数据,然后基于来自查询的数据来增加计数。由于Node.js是异步的,因此在读取所有数据之前会显示总计。 我创建了一个简单的示例,以达到我目前正在做的事情 我不确定要等到两个功能都完成后才能打印总计,我该做什么。我是否需要创建一个自定义事件发射器来实现这一目标? 问题答案: 拥抱异步性: 或使用Promi

  • 我有一个方法,可以为WebView的WebEngine设置一个新的网页,需要等到网页加载完成后才能继续使用当前方法。 基本上我想要: 我尝试过使用ChangeListener(),但它只会在我的方法完成执行后执行。我在谷歌上搜索了许多导致更多挫折感的术语,比如“java非阻塞等待布尔值”。最终,我成功地启动了新线程(以防止应用程序GUI锁定)并使用了倒计时(与Thread.join()相反)。下面

  • 我有两个JS函数。一个叫另一个。在调用函数中,我想调用另一个函数,等待该函数完成,然后继续。例如,伪代码: 我想出了这个解决方案,但不知道这是否是一个明智的方法。 这合法吗?有没有更优雅的处理方法?也许用jQuery?

  • 问题内容: 我试图在Selenium / Python中运行一个脚本,该脚本要求在其他位置登录才能运行其余脚本。有什么办法让我告诉脚本暂停并在登录屏幕上等待,以便用户手动输入用户名和密码(也许是等待页面标题更改的内容,然后继续执行脚本)。 到目前为止,这是我的代码: 问题答案: 使用WebDriverWait。例如,这将执行google搜索,然后等待某个元素出现,然后再打印结果: 将返回lambd

  • 我有一个加载页面,我想在其中对不相关的信息执行两个网络请求(rxjava)。在这两个请求完成之前,我不想进入下一页,即使其中一个或两个都失败了。 > 使用zip将请求绑定在一起。有没有办法不必被迫使用双函数,也不必返回null? 请求A和B有一个。doOnNext和。多恩。如果其中一个返回错误,zip observable是否继续?zip订阅服务器是否也会返回错误? 这是最好的方法吗?

  • 我必须使用axios提出请求,以便获取一些数据,这些数据应该作为道具传递给React组件。下面是我的渲染函数: FateChBoardList是一个异步函数,因此它将返回一个promise。我可以将然后和捕获处理程序附加到返回promise,但在这种情况下,我必须在两个处理程序中放入相同的超文本标记语言代码。还有别的办法吗?