2017-02-28 126 views
1

有什么方法可以在Java中创建睡眠线程或进程,从而开始执行某些事件?Java中的睡眠线程或进程

我是新来的多线程,我想创建一个进程或线程,它将处于睡眠模式,应该只在某些变化时才会被激活。

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

+3

答案是Object.wait/notify/notifyAll我正在寻找一个很好的教程来发布给你,但找不到一个。搜索互联网并查找关于这些方法的更多信息 – ControlAltDel

+0

创建之后,Java线程不会运行,直到其[[start()'](https://docs.oracle.com/javase/7/docs/api/java /lang/Thread.html#start%28%29)方法被调用。 – JimmyB

+0

您可以检查https://punekaramit.wordpress.com/2010/04/27/producer-consumer-using-java-threads-waitnotifyall/出于Object.wait/notify,如上述评论中所述。 – Amit

回答

0

你应该看看ExecutorsThreadPoolExecutor。基本上,线程池中的线程会“驻留”,休眠,直到在线程池上提交任务。

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

-1

您可以在链接,参阅我的回答另一个问题:https://stackoverflow.com/a/42049397/504133

。在上面的链接的答案,我实现了一个小的模型,你可以在非活动状态的线程,当你想你可以在主动模式下恢复。

我已经使用一个对象来锁定。在同步块内部,一个线程可以执行其通常分配的工作,但是如果我们希望将其置于非活动模式,它可以通知其他人等待线程(如果有的话)以准备好获取锁,然后锁定它,放弃锁并转到非主动等待状态。

现在其他线程被唤醒并且它们相互完成锁获取,谁曾经线程获得这个锁获取锁,完成它的工作并且在某些事件中它可以做同样的事情第一个线程,通知其他线程被唤醒以争夺锁获取,它放弃锁并进入等待状态。

0

有没有什么办法在Java中创建睡眠线程或进程,从而开始某些事件?

字面意思?号码

有效吗?是。

当你start()一个线程,它开始是写给执行run()方法---想必,一个run()方法。没有其他方式来启动线程。

run()方法给你(程序员)总控制的线程。如果你想要一个等待某个事件并响应它的线程,那么写一个等待该事件并响应它的run()方法。如果你想要一个能够一次又一次完成相同任务的线程,那么就写一个run()方法,循环做一遍又一遍。

就这么简单。

0

如何让一个线程等待

你需要一个对象的线程不应该在这种情况下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和要在其中侦听文件更改的目录的路径。然后你必须注册你想听的事件非常重要的是你添加静态导入。

  • 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); 

之后,你应该创建一个,而(真)循环,等待事件。以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; 
     } 
    } 
} 

把这两个代码片段放到一个线程中,并且您有自己的线程在文件事件上调用。