词条 | Wait |
释义 | wait英语中有等待的意思,在计算机领域她还带是一种Java术语,C语言中也有wait命令。 Java术语术语名称:wait waitpublic final void wait() throws InterruptedException在其他线程调用此对象的 notify()方法或 notifyAll()方法前,导致当前线程等待。换句话说,此方法的行为就好像它仅执行 wait(0)调用一样。 当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify方法,或 notifyAll方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。 对于某一个参数的版本,实现中断和虚假唤醒是可能的,而且此方法应始终在循环中使用: synchronized (obj) { while (<condition does not hold>) obj.wait(); ... // Perform action appropriate to condition } 此方法只应由作为此对象监视器的所有者的线程来调用。有关线程能够成为监视器所有者的方法的描述,请参阅 notify方法。 抛出:IllegalMonitorStateException- 如果当前线程不是此对象监视器的所有者。 InterruptedException- 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态被清除。 waitpublic final void wait(long timeout) throws InterruptedException在其他线程调用此对象的 notify()方法或 notifyAll()方法,或者超过指定的时间量前,导致当前线程等待。 当前线程必须拥有此对象监视器。 此方法导致当前线程(称之为 T)将其自身放置在对象的等待集中,然后放弃此对象上的所有同步要求。出于线程调度目的,在发生以下四种情况之一前,线程 T被禁用,且处于休眠状态: 其他某个线程调用此对象的 notify方法,并且线程 T碰巧被任选为被唤醒的线程。 其他某个线程调用此对象的 notifyAll方法。 其他某个线程中断线程 T。 大约已经到达指定的实际时间。但是,如果 timeout为零,则不考虑实际时间,在获得通知前该线程将一直等待。 然后,从对象的等待集中删除线程 T,并重新进行线程调度。然后,该线程以常规方式与其他线程竞争,以获得在该对象上同步的权利;一旦获得对该对象的控制权,该对象上的所有其同步声明都将被恢复到以前的状态,这就是调用 wait方法时的情况。然后,线程 T从 wait方法的调用中返回。所以,从 wait方法返回时,该对象和线程 T的同步状态与调用 wait方法时的情况完全相同。 在没有被通知、中断或超时的情况下,线程还可以唤醒一个所谓的虚假唤醒(spurious wakeup)。虽然这种情况在实践中很少发生,但是应用程序必须通过以下方式防止其发生,即对应该导致该线程被提醒的条件进行测试,如果不满足该条件,则继续等待。换句话说,等待应总是发生在循环中,如下面的示例: synchronized (obj) { while (<condition does not hold>) obj.wait(timeout); ... // Perform action appropriate to condition } (有关这一主题的更多信息,请参阅 Doug Lea 撰写的 Concurrent Programming in Java (Second Edition) (Addison-Wesley, 2000) 中的第 3.2.3 节或 Joshua Bloch 撰写的 Effective Java Programming Language Guide (Addison-Wesley, 2001) 中的第 50 项。 如果当前线程在等待之前或在等待时被任何线程中断,则会抛出 InterruptedException。在按上述形式恢复此对象的锁定状态时才会抛出此异常。 注意,由于 wait方法将当前线程放入了对象的等待集中,所以它只能解除此对象的锁定;可以同步当前线程的任何其他对象在线程等待时仍处于锁定状态。 此方法只应由作为此对象监视器的所有者的线程来调用。有关线程能够成为监视器所有者的方法的描述,请参阅 notify方法。 参数:timeout- 要等待的最长时间(以毫秒为单位)。 抛出:IllegalArgumentException- 如果超时值为负。 IllegalMonitorStateException- 如果当前线程不是此对象监视器的所有者。 InterruptedException- 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态被清除。 waitpublic final void wait(long timeout, int nanos) throws InterruptedException在其他线程调用此对象的 notify()方法或 notifyAll()方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。 此方法类似于一个参数的 wait方法,但它允许更好地控制在放弃之前等待通知的时间量。用毫微秒度量的实际时间量可以通过以下公式计算出来: 1000000*timeout+nanos在其他所有方面,此方法执行的操作与带有一个参数的 wait(long)方法相同。需要特别指出的是,wait(0, 0)与 wait(0)相同。 当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权,并等待下面两个条件之一发生: 其他线程通过调用 notify方法,或 notifyAll方法通知在此对象的监视器上等待的线程醒来。 timeout毫秒值与 nanos毫微秒参数值之和指定的超时时间已用完。 然后,该线程等到重新获得对监视器的所有权后才能继续执行。 对于某一个参数的版本,实现中断和虚假唤醒是有可能的,并且此方法应始终在循环中使用: synchronized (obj) { while (<condition does not hold>) obj.wait(timeout, nanos); ... // Perform action appropriate to condition } 此方法只应由作为此对象监视器的所有者的线程来调用。有关线程能够成为监视器所有者的方法的描述,请参阅 notify方法。 参数:timeout- 要等待的最长时间(以毫秒为单位)。 nanos- 额外时间(以毫微秒为单位,范围是 0-999999)。 抛出:IllegalArgumentException- 如果超时值是负数,或者毫微秒值不在 0-999999 范围内。 IllegalMonitorStateException- 如果当前线程不是此对象监视器的所有者。 InterruptedException- 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态被清除。 wait的英文解释wait [weIt] n. 等待, 等待时间 v. 等, 耽搁, 等候; 等候, 延缓, 期待 C语言中的wait函数wait(等待子进程中断或结束) 相关函数 waitpid,fork 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t wait (int * status); 函数说明 wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数status 可以设成NULL。子进程的结束状态值请参考下面的waitpid()。 返回值 如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno 中。 附加说明 范例 #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/wait.h> main() { pid_t pid; int status,i; if(fork()= =0){ printf(“This is the child process .pid =%d\”,getpid()); exit(5); }else{ sleep(1); printf(“This is the parent process ,wait for child...\”; pid=wait(&status); i=WEXITSTATUS(status); printf(“child’s pid =%d .exit status=%d\”,pid,i); } } 执行 This is the child process.pid=1501 This is the parent process .wait for child... child’s pid =1501,exit status =5 waitpid(等待子进程中断或结束) 相关函数 wait,fork 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t waitpid(pid_t pid,int * status,int options); 函数说明 waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数status 可以设成NULL。参数pid 为欲等待的子进程识别码,其他数值意义如下: pid<-1 等待进程组识别码为pid 绝对值的任何子进程。 pid=-1 等待任何子进程,相当于wait()。 pid=0 等待进程组识别码与目前进程相同的任何子进程。 pid>0 等待任何子进程识别码为pid 的子进程。 参数option 可以为0 或下面的OR 组合: WNOHANG 如果没有任何已经结束的子进程则马上返回,不予以等待。 WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。 子进程的结束状态返回后存于status,底下有几个宏可判别结束情况: WIFEXITED(status)如果子进程正常结束则为非0 值。 WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。 WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真。 WTERMSIG(status)取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。 WIFSTOPPED(status)如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。 WSTOPSIG(status)取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED 来判断后才使用此宏。 返回值 如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno 中。 用途等待直到一个进程标识终止。 语法wait [ ProcessID ... ] 变形: 现在时态过去时态 过去分词现在进行时 wait waited waited waiting 描述wait 命令等待(暂停执行)直到由ProcessID 变量指定的进程标识终止。如果没有指定ProcessID 变量,wait 命令会等待直到调用 shell 的所有已知进程标识终止并且以0 为退出状态退出。如果ProcessID 变量代表一个未知的进程标识,wait 命令会把它们视为以127 为退出状态退出的已知进程标识。wait 命令以ProcessID 变量指定的上个进程标识的退出状态退出。 标志ProcessID 指定一个命令的无符号十进制整数进程标识,wait 命令会等待直到该进程标识终止。 退出状态 如果指定一个或多个操作数,所有的操作数终止或不为调用 shell 所知,并且上个操作数指定的状态是已知的,那么 wait 命令的退出状态与上个操作数指定的命令退出状态信息相同。如果进程由于收到信号而异常终止,那么退出状态会大于128 并且与其它信号生成的退出状态信息不同,尽管未指定确切的状态值(请参阅 kill -l 命令选项)。否则,wait 命令会以以下值中的一个退出: 0 以无操作数方式调用 wait 命令,并且调用的 shell 所已知的所有进程标识已经终止。 1-126 wait 命令检测到一个错误。 127 由上一个指定的ProcessID 操作数所标识的命令是未知的。 文件/usr/bin/wait 包含 wait 命令。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。