用Java沉睡线程或进程

时间:2017-02-28 16:00:22

标签: java multithreading

有没有办法在Java中创建休眠线程或进程,哪些事件开始?

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

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

4 个答案:

答案 0 :(得分:0)

您应该查看ExecutorsThreadPoolExecutor。基本上,线程池中的线程被“停放”,休眠,直到在线程池上提交任务。

您还应该调查使用RxJava的可能性。它的Observer / Observable范例可能符合您的需求。

答案 1 :(得分:0)

  

有没有办法在Java中创建休眠线程或进程,哪些事件开始?

字面上?否。

有效?是。

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

run()方法为您(程序员)提供了线程的总控制。如果你想要一个等待某个事件并响应它的线程,那么写一个等待事件并响应它的run()方法。如果你想要一个一次又一次地做同样事情的线程,那么写一个循环的run()方法,一次又一次地做任何事情。

就这么简单。

答案 2 :(得分:0)

如何让线程等待

在这种情况下,你需要一个线程不应该使用并行的对象 aObj 。 它无关紧要哪个类 aObj 。第一个Thread将在 aObj.wait()行等待,直到另一个Thread调用 aObj.notify()

第一个Thread中的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和一个指向您要监听文件更改的目录的路径。然后你必须注册你想要听的非常重要的事件是你添加静态导入。

  • ENTRY_CREATE - 创建目录条目
  • ENTRY_DELETE - 删除目录条目。
  • ENTRY_MODIFY - 修改目录条目。
  • OVERFLOW - 表示事件可能已丢失或丢弃。您无需注册OVERFLOW事件即可接收它。

有关详细信息,请查看此网站: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);

之后你应该创建一个 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;
        }
    } 
}

获取这两个代码片段并将它们放入一个线程中,你有自己的Thread,它在文件事件中被调用。

答案 3 :(得分:-1)

您可以在链接中将我的答案引用到另一个问题:https://stackoverflow.com/a/42049397/504133

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

我使用了一个Object来锁定。在同步块内部,线程可以执行其通常分配的作业,但是如果我们希望以非活动模式获取它,它可以通知其他等待线程,如果有任何准备好获取锁定然后锁定它放弃锁定并转到非活跃的等待状态。

现在其他线程被唤醒,他们彼此完成锁定获取,谁就是线程获胜,这获得了锁定,完成了它的工作,如果是某些事件,它可以做同样的事情。线程,通知其他线程被唤醒以竞争锁定获取,它放弃锁定并进入等待状态。