有什么方法可以在Java中创建睡眠线程或进程,从而开始执行某些事件?Java中的睡眠线程或进程
我是新来的多线程,我想创建一个进程或线程,它将处于睡眠模式,应该只在某些变化时才会被激活。
Ex。如果我在某个目录中添加任何文件,或者我在文件中做了一些更改,那么只有我的睡眠线程或进程应该自动启动。 最好的例子是tomcat,它通过它自己重新加载应用程序上下文。
有什么方法可以在Java中创建睡眠线程或进程,从而开始执行某些事件?Java中的睡眠线程或进程
我是新来的多线程,我想创建一个进程或线程,它将处于睡眠模式,应该只在某些变化时才会被激活。
Ex。如果我在某个目录中添加任何文件,或者我在文件中做了一些更改,那么只有我的睡眠线程或进程应该自动启动。 最好的例子是tomcat,它通过它自己重新加载应用程序上下文。
你应该看看Executors和ThreadPoolExecutor。基本上,线程池中的线程会“驻留”,休眠,直到在线程池上提交任务。
您还应该调查使用RxJava的可能性。它的Observer/Observable范例可能适合您的需求。
您可以在链接,参阅我的回答另一个问题:https://stackoverflow.com/a/42049397/504133
。在上面的链接的答案,我实现了一个小的模型,你可以在非活动状态的线程,当你想你可以在主动模式下恢复。
我已经使用一个对象来锁定。在同步块内部,一个线程可以执行其通常分配的工作,但是如果我们希望将其置于非活动模式,它可以通知其他人等待线程(如果有的话)以准备好获取锁,然后锁定它,放弃锁并转到非主动等待状态。
现在其他线程被唤醒并且它们相互完成锁获取,谁曾经线程获得这个锁获取锁,完成它的工作并且在某些事件中它可以做同样的事情第一个线程,通知其他线程被唤醒以争夺锁获取,它放弃锁并进入等待状态。
有没有什么办法在Java中创建睡眠线程或进程,从而开始某些事件?
字面意思?号码
有效吗?是。
当你start()
一个线程,它开始是你写给执行run()
方法---想必,一个run()
方法。没有其他方式来启动线程。
run()
方法给你(程序员)总控制的线程。如果你想要一个等待某个事件并响应它的线程,那么写一个等待该事件并响应它的run()
方法。如果你想要一个能够一次又一次完成相同任务的线程,那么就写一个run()
方法,循环做一遍又一遍。
就这么简单。
你需要一个对象的线程不应该在这种情况下aObj使用并行。 其无所谓哪一类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和要在其中侦听文件更改的目录的路径。然后你必须注册你想听的事件非常重要的是你添加静态导入。
欲了解更多信息,看看这个网站:Watching a Directory for Changes
import static java.nio.file.StandardWatchEventKinds.*;
WatchService watcher = FileSystems.getDefault().newWatchService();
Path dir = Paths.get("C:\\PATHTOYOUR\\DIRECTORY\\");
dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
之后,你应该创建一个,而(真)循环,等待事件。以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;
}
}
}
把这两个代码片段放到一个线程中,并且您有自己的线程在文件事件上调用。
答案是Object.wait/notify/notifyAll我正在寻找一个很好的教程来发布给你,但找不到一个。搜索互联网并查找关于这些方法的更多信息 – ControlAltDel
创建之后,Java线程不会运行,直到其[[start()'](https://docs.oracle.com/javase/7/docs/api/java /lang/Thread.html#start%28%29)方法被调用。 – JimmyB
您可以检查https://punekaramit.wordpress.com/2010/04/27/producer-consumer-using-java-threads-waitnotifyall/出于Object.wait/notify,如上述评论中所述。 – Amit