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

如何通知另一个线程文件被修改

卢伟志
2023-03-14

我是java多线程编程的新手。我知道它可以通过线程通信来完成,但我不知道如何继续。我不知道如果在文件中进行了一些更改,一个线程将如何通知另一个线程。问题在下面提到。

我有一个逗号分隔的文件,其中写入了一些行。我希望从我的主线程启动两个线程。csv文件可能会附加到外部/手动。如果csv文件中做了一些更改,其中一个线程将通知第二个线程,第二个线程将逐行并发读取该文件并执行一些任务。

谢谢

共有2个答案

郭星文
2023-03-14

您创建两个线程,在它们的run方法中,它们都使用一个Object作为线程等待和通知信号。

第一个线程(T1)将在对象上同步并等待它。第二个线程(T2)将在对象上同步,对其执行某些操作,并发出通知。

以下片段应该会给你一些想法...(请忽略无休止的循环和糟糕的异常处理,这只是为了便于理解而表达的想法)。

public class IdeaOfThreadingWithWaitAndNotify {

    public static void main(String[] args)  {
        File f = new File("grow.txt");
        if(!f.exists()) {
            try {
                f.createNewFile();
                Thread appenderThread = new Thread(new FileAppender(f));
                Thread checkerThread = new Thread(new FileSizeCounter(f));
                appenderThread.start();
                checkerThread.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static class FileAppender implements Runnable {
        private File file;
        private FileOutputStream fos;
        public FileAppender(File file) throws FileNotFoundException {
            super();
            this.file = file;
            fos = new FileOutputStream(file);
        }
        public void run() {
            while(true) {
                synchronized (file) {                   
                    try {
                        fos.write("Appended... ".getBytes());
                        fos.flush();
                        file.notify();
                        Thread.sleep(1000);
                    } catch (IOException e) {
                    } catch (InterruptedException e) {
                    }
                }
            }
        }

    }

    public static class FileSizeCounter implements Runnable {
        private File file;
        public FileSizeCounter(File file) {
            super();
            this.file = file;
        }
        public void run() {
            while(true) {
                synchronized (file) {
                    try {
                        file.wait();
                    } catch (InterruptedException e) {
                    }
                    System.out.println("File changed .. now size is " + file.length());
                    // you can do other stuff with the file...
                }
            }
        }
    }
}

您可以看到,在两个线程之间,它们共享同一个“文件”实例,并将其用作等待和通知信号。调用wait的对象将在那里停止其执行流,直到另一个线程对其调用notify。然后等待的线程可以继续。

我希望这有帮助。

郏博瀚
2023-03-14

你可以使用java。尼奥。文件WatchService可用于此目的
参考教程

从链接:-

Watch Service API专为需要通知文件更改事件的应用程序而设计。它非常适合任何可能有许多打开文件并需要确保文件与文件系统同步的应用程序,例如编辑器或IDE。它也非常适合监视目录的应用程序服务器,可能等待. jsp或. jar文件删除以部署它们。

 类似资料:
  • 问题内容: 我在Java中的线程上有些挣扎,我有三个线程- 线程1,线程2和线程3。那些启动时正在执行某些任务,我想通过thread1停止这两个线程。我将thread1放在,然后停止两个线程,但是两个线程的进程仍在运行。你有什么想法吗? 问题答案: 您如何试图阻止他们??警告此方法已弃用。 而是考虑对线程1使用某种标志来与线程2和3通信,它们应该停止。实际上,您可能会使用interrupts。 下

  • 以下是问题陈述: 编写一个java程序,使用线程计算前25个素数,并计算前50个斐波那契数。将计算斐波那契数的线程的优先级设置为8,将另一个设置为5。在计算了30个斐波那契数之后,让这个线程进入睡眠状态,开始计算素数。计算完25个素数后,继续斐波那契数计算。 我的代码: 我本以为当斐波那契线停止时,其余的素数会被打印出来,但那没有发生,这背后的原因可能是什么?

  • 问题内容: 我想打开一个文件,该文件由另一个应用程序定期写入。此应用程序无法修改。因此,我只想在我知道该文件未被其他应用程序写入时才打开该文件。 有python方式可以做到这一点吗?否则,如何在Unix和Windows中实现呢? 编辑 :我将尝试澄清。 有没有办法检查当前文件是否已被另一个应用程序打开? 我想从这个问题开始。这些其他应用程序现在是否读写无关紧要。 我意识到这可能与操作系统有关,所以

  • 我试图用一个自定义对象创建一个新线程,然后从主线程调用这个自定义对象方法。其思想是,主线程可以继续执行其他任务,而自定义对象可以继续在第二个线程中工作: 输出为: 它应该更像这样: 所以主线程被阻塞,直到方法完成。主线程是否在第二个线程中等待完成(作为返回类型为空,我认为情况不会如此)?还是在第一个线程中执行,因此阻塞了它? 我知道使用下面的代码,我可以在另一个线程中执行,但它每次都会从头开始创建

  • 我有两个jar文件,一个是minecraft服务器<code>插口。另一个是我自己的jar(),其中有几个小的自定义类。 < code>patch.jar中的类需要替换< code>spigot.jar中的类,我已经阅读了许多关于这样做的“教程”和问题,但是除了使用启动脚本中的classpath选项之外,没有一个提供关于如何实际执行的基本信息。 我试过了: -Patch.jar:抛出补丁的错误"n

  • 我正在做一个项目,它使用原始Java并发结构,如等待()、通知()、通知()、Thread.run()、同步化等。在我的项目中,有多个线程(线程类的扩展)会定期从队列中获取一个对象。因此,我使用了一个有内部TimerWork类的Timer类。 我的问题是,我无法获得如何让其他线程定期唤醒。我的主要类不是这些线程或计时器类。因此,我从另一个类调用它们的运行。我不知道如何让这些线程每100毫秒等待和通