Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用具有无限循环的线程(可调用)进行Cumminging_Java_Multithreading_Event Handling_Thread Safety - Fatal编程技术网

Java 使用具有无限循环的线程(可调用)进行Cumminging

Java 使用具有无限循环的线程(可调用)进行Cumminging,java,multithreading,event-handling,thread-safety,Java,Multithreading,Event Handling,Thread Safety,我已经定义了一个名为“folderwatcher”的类(可调用),用于监视特定文件夹的任何更改。主代码位于类似以下内容的无限循环中:。我希望调用此“folderwatcher”的方法/类侦听“folderwatcher”发现的任何事件,并基于该事件执行一些操作。有人知道我怎么做吗?我需要一个事件处理程序吗?有什么例子吗? 谢谢使用回拨。这可以通过在父对象上实现同步方法来实现,然后将对父对象的引用传递到可运行对象的构造函数中。然后,runnable可以调用父级上的方法来通知它一些事情 )使用回调。

我已经定义了一个名为“folderwatcher”的类(可调用),用于监视特定文件夹的任何更改。主代码位于类似以下内容的无限循环中:。我希望调用此“folderwatcher”的方法/类侦听“folderwatcher”发现的任何事件,并基于该事件执行一些操作。有人知道我怎么做吗?我需要一个事件处理程序吗?有什么例子吗?
谢谢

使用回拨。这可以通过在父对象上实现同步方法来实现,然后将对父对象的引用传递到可运行对象的构造函数中。然后,runnable可以调用父级上的方法来通知它一些事情


)使用回调。这可以通过在父对象上实现同步方法来实现,然后将对父对象的引用传递到可运行对象的构造函数中。然后,runnable可以调用父级上的方法来通知它一些事情


)首先,使用无限循环方法是错误的。如果您确实在使用
Callable
,那么您已经在使用
ExecutorService
。您应该使用的是
ScheduledExecutorService
,并将代码作为重复任务进行调度

对于事件处理程序而言,这并不难实现,例如:

interface FileDetectedHandler { void fileDetected(File f); }

public static void main(String[] args) {
  final ScheduledExecutorService scheduler = 
     Executors.newSingleThreadScheduledExecutor();
  final FileDetectedHandler h = new FileDetectedHandler(File f) {
    public void fileDetected(File f) {
      System.out.format("File detected: %s\n", f);
  }};
  final Runnable r = new Runnable() { public void run() {
    File f = null;
    //detect file
    if (f != null) h.fileDetected(f);
  }};
  scheduler.scheduleWithFixedDelay(r, 0, 2, TimeUnit.SECONDS);
}

首先,使用无限循环方法是错误的。如果您确实在使用
Callable
,那么您已经在使用
ExecutorService
。您应该使用的是
ScheduledExecutorService
,并将代码作为重复任务进行调度

对于事件处理程序而言,这并不难实现,例如:

interface FileDetectedHandler { void fileDetected(File f); }

public static void main(String[] args) {
  final ScheduledExecutorService scheduler = 
     Executors.newSingleThreadScheduledExecutor();
  final FileDetectedHandler h = new FileDetectedHandler(File f) {
    public void fileDetected(File f) {
      System.out.format("File detected: %s\n", f);
  }};
  final Runnable r = new Runnable() { public void run() {
    File f = null;
    //detect file
    if (f != null) h.fileDetected(f);
  }};
  scheduler.scheduleWithFixedDelay(r, 0, 2, TimeUnit.SECONDS);
}

@侯赛因:“回调”和“可回调”不是一回事!回调-不同的概念。@Hossein-“回调”和“可调用”不是一回事!回调-不同的概念。你能使用Java7吗?它有内置的东西this@Eugene链接中的代码已经在使用Java 7 WatchService API。您可以使用Java 7吗?它有内置的东西this@Eugene链接中的代码已经使用Java 7 WatchService API.thx作为示例,请提供更多代码细节。我不是一个真正的java专家。这真的没什么大不了的。我已经更新了两个ExecutorService API调用,现在这是一个完整的示例,除了您已有的文件检测代码。@MarkoTopolnik您的意思可能是:
scheduler.scheduleAtFixedRate(…)
@assylias谢谢,更正了(WithFixedDelay稍微有点道理,所以我将使用它)@MarkoTopolnik ur方法的问题是,当我在“监控”文件夹中添加/删除多个文件时,它只能检测一个文件的一次操作。你能帮我吗?以thx为例,请给我更多的代码细节。我不是一个真正的java专家。这真的没什么大不了的。我已经更新了两个ExecutorService API调用,现在这是一个完整的示例,除了您已有的文件检测代码。@MarkoTopolnik您的意思可能是:
scheduler.scheduleAtFixedRate(…)
@assylias谢谢,更正了(WithFixedDelay稍微有点道理,所以我将使用它)@MarkoTopolnik ur方法的问题是,当我在“监控”文件夹中添加/删除多个文件时,它只能检测一个文件的一次操作。你能帮我一下吗?