Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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中的休眠线程或进程_Java_Multithreading - Fatal编程技术网

Java中的休眠线程或进程

Java中的休眠线程或进程,java,multithreading,Java,Multithreading,是否有任何方法可以在Java中创建睡眠线程或进程,这些线程或进程可以从某个事件开始 我是多线程新手,我想创建一个进程或线程,它将处于睡眠模式,并且只有在某些更改时才会被激活 若我在某个目录中添加了任何文件,或者对文件做了一些更改,那个么只有休眠线程或进程会自动启动。 最好的例子是tomcat,它自己重新加载应用程序上下文。您应该查看和。基本上,线程池中的线程是“驻存”的,处于休眠状态,直到在线程池上提交任务为止 您还应该调查使用的可能性。它的观察者/可观察范式可能适合您的需要。您可以在链接中参考

是否有任何方法可以在Java中创建睡眠线程或进程,这些线程或进程可以从某个事件开始

我是多线程新手,我想创建一个进程或线程,它将处于睡眠模式,并且只有在某些更改时才会被激活

若我在某个目录中添加了任何文件,或者对文件做了一些更改,那个么只有休眠线程或进程会自动启动。 最好的例子是tomcat,它自己重新加载应用程序上下文。

您应该查看和。基本上,线程池中的线程是“驻存”的,处于休眠状态,直到在线程池上提交任务为止


您还应该调查使用的可能性。它的观察者/可观察范式可能适合您的需要。

您可以在链接中参考我对另一个问题的回答:

在上面链接的答案中,我已经实现了一个小模型,在这个模型中,可以让线程处于非活动状态,并且当您希望将其恢复为活动模式时

我用了一个物体来锁定。在同步块内,线程可以执行其通常分配的任务,但如果我们希望以非活动模式获取它,它可以通知其他等待的线程(如果有)准备获取锁,然后锁定它放弃锁并进入非活动等待状态

现在,其他线程被唤醒,它们彼此完成锁获取,因此任何线程都会获得锁,并执行其工作,在某些事件中,它可以执行与第一个线程相同的操作,通知其他线程被唤醒以竞争锁获取,它放弃锁并进入等待状态

是否有任何方法可以在Java中创建睡眠线程或进程,这些线程或进程可以从某个事件开始

真的吗?没有

有效地?对

当您
start()
一个线程时,它开始执行一个
run()
方法——大概是您编写的一个
run()
方法。没有其他方法可以启动线程

run()
方法为您(程序员)提供对线程的完全控制。如果希望线程等待某个事件并对其作出响应,则编写一个
run()
方法来等待事件并对其作出响应。如果你想要一个线程一次又一次地做同样的事情,那么写一个
run()
方法来循环,一次又一次地做任何事情

就这么简单。

如何让线程等待 您需要一个线程在这种情况下不应并行使用的对象aObj。 不管是哪一类。第一个线程将在aObj.wait()行等待,直到另一个线程调用aObj.notify()

第一个线程中的run方法:

synchronized(aObj) {
    try {
        //Doing something
        //Wait at the next line
        aObj.wait();
        //Not reached until aObj.notify is called
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
第二根线

synchronized(aObj) {
    aObj.notify();
}

如何侦听文件更改 首先,您需要一个WatcherService和一个指向要侦听文件更改的目录的路径。然后你必须注册你想要监听的事件非常重要的是你添加了静态导入

  • 条目\创建-创建目录条目
  • 条目\删除–删除目录条目
  • 条目\修改–修改目录条目
  • 溢出–表示事件可能已丢失或丢弃。您无需注册溢出事件即可接收它
有关更多信息,请访问此网站:

之后,您应该创建while(true)循环并等待事件。使用watcher.Take()获取事件,并通过调用key.pollEvents()获取事件列表。遍历它,就可以得到文件名和事件

while(true){
    WatchKey key = watcher.take();
    //Wait until a events arrives
    List<WatchEvent<?>> events = key.pollEvents();
    
    for(int i = 0; i < events.size(); i++){
        //Get the kind of Event
        WatchEvent.Kind<?> kind = events.get(i).kind();
        
        //Get the filename
        WatchEvent<Path> ev = (WatchEvent<Path>) events.get(i);
        Path filename = ev.context();
         
        //Differentiate between the different events
        if(kind == ENTRY_CREATE){
            
        }else if(kind == ENTRY_DELETE){
            
        }else if(kind == ENTRY_MODIFY){
            
        }else if(kind == OVERFLOW){
            
        }
        
        //Exit the loop if the key is inaccessible
        boolean valid = key.reset();
        if (!valid) {
            break;
        }
    } 
}
while(true){
WatchKey=watcher.take();
//等到一个事件到来
List kind=events.get(i).kind();
//获取文件名
WatchEvent ev=(WatchEvent)events.get(i);
路径文件名=ev.context();
//区分不同的事件
如果(种类==条目\创建){
}else if(种类==条目\删除){
}else if(种类==条目\修改){
}else if(种类==溢出){
}
//如果无法访问密钥,则退出循环
布尔有效值=key.reset();
如果(!有效){
打破
}
} 
}

将这两段代码片段放到一个线程中,您就有了自己的线程,该线程在文件事件中被调用。

答案是Object.wait/notify/notifyAll我正在为您寻找一个好的教程,但找不到。搜索internet并查找有关这些方法的更多信息创建后,Java线程在调用其方法之前不会运行。您可以签出Object.wait/notify,如上述注释所述。
while(true){
    WatchKey key = watcher.take();
    //Wait until a events arrives
    List<WatchEvent<?>> events = key.pollEvents();
    
    for(int i = 0; i < events.size(); i++){
        //Get the kind of Event
        WatchEvent.Kind<?> kind = events.get(i).kind();
        
        //Get the filename
        WatchEvent<Path> ev = (WatchEvent<Path>) events.get(i);
        Path filename = ev.context();
         
        //Differentiate between the different events
        if(kind == ENTRY_CREATE){
            
        }else if(kind == ENTRY_DELETE){
            
        }else if(kind == ENTRY_MODIFY){
            
        }else if(kind == OVERFLOW){
            
        }
        
        //Exit the loop if the key is inaccessible
        boolean valid = key.reset();
        if (!valid) {
            break;
        }
    } 
}