java线程wait方法
wait和notify是用在多线程竞争同一锁资源的情况下使用的。你这段代码实际是个单线程,这个线程自己把自己阻塞了,自然不可能自己把自己唤醒。你的意图怎么实现呢?需要加入另外一个线程,下面是我仿照你的意图写的一段代码,供参考下public class A{ public A(){ final A a = this; Thread th1 = new Thread(){ @Override public void run(){ //一直循环,去尝试着唤醒a try { this.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }//为检查是不是能真正实现唤醒a,等待10000毫秒,此时保证a已经处于等待状态中。 while(true){ /** * 用notify唤醒的线程必须是持有当前锁对象的线程 */ synchronized (a){ a.notify(); } } } }; th1.setDaemon(true);//这句也是必须的,将th1设为守护线程,保证在唤醒a以后,所有活动的线程都为守护线程,jvm能及时推出 th1.start();//和a.run的顺序不可以换 this.run(); } public static void main(String[] args) { new A(); } public void run() { /** * 这里可以换成这样,直接锁住this就行了 */ synchronized (this) { try { this.wait();//阻塞当前的线程 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ System.out.println("1");//执行finally } } } }
finally里面的代码会执行指的是在try-catch-finally中catch代码中发生了异常,程序无法执行下去,但是finally中的语句会执行(除非jvm退出,比如在finally之前谢了System.exit(0);). 可你这个代码里面也没有抛出异常啊。。 对,一直等着呢。。
错误太多1. 错误太多1.wait notify 是用在多线程的地方,你这就一个线程,自己把自己阻塞了,怎么可能还跑的下去2.看这段:Z alias1 = this;Z alias2 = this;synchronized(alias1) {try {alias2.wait(); alias1,alias2根本就是一个对象的不同引用,有必要定义两个吗,而且都指向this,无语,直接用this不就完了synchronized(this),
wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生

java关于等待线程结束的问题!
简单地可以使用 Thread.join() 方法来等待线程结束,例如这样修改一下:Thread t = new Thread() { // 同原来的 run()};t.start();// 调用这个方法,会挂起当前线程直至线程t结束t.join();join()方法的文档是这么写的: Waits for this thread to die.也可以用wait/notify或mutex等机制来对两个线程进行同步,稍微复杂一点,例如使用 wait/notify:new Thread() { public void run() { // 同原来的代码,加上以下代码用于同步 synchronized (results) { results.notifyAll(); } }}.start();// 通过以下代码挂起当前线程,等待其他线程通知synchronized (results) { results.wait();}以供参考。同 i178269245 所说,等待线程结束势必要挂起当前线程,也就没必要用线程了,也许需要重新考虑一下这种实现方式。
有这种需求用什么线程,线程就是做异步处理的。

进程进入等待状态有哪几种方式
进程进入等待状态有:A、CPU调度给优先级更高的线程。B、阻塞的线程获得资源或者信号。C、在时间片轮转的情况下,如果时间片到了。D、获得spinlock未果。a、是由运行态进入就绪态。b、是有阻塞太进入就绪态。c、是由就绪态进入运行态。d、一直就绪态。内容一个计算机系统进程包括(或者说“拥有”)下列数据:那个程序的可运行机器码的一个在存储器的映像。 分配到的存储器(通常包括虚拟内存的一个区域)。存储器的内容包括可运行代码、特定于进程的数据(输入、输出)、调用堆栈、堆栈(用于保存运行时运数中途产生的数据)。 分配给该进程的资源的操作系统描述符,诸如文件描述符(Unix术语)或文件句柄(Windows)、数据源和数据终端。
根据进程执行时的间断性,决定了进程可能具有多种状态。但事实上,运行中的进程是具有以下三种基本状态。1、就绪状态,英文称Ready。进程已获得除处理器外的所需资源,只是在等待分配处理器资源,只要分配了处理器进程就可执行。准备就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列。当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。2、运行状态,英文称Running。进程占用处理器资源,处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),系统通常会自动执行系统的空闲进程。3、阻塞状态,英文称Blocked,系统由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理器资源分配给该进程,该进程也无法进行运行。定义狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
进程进入等待状态有哪几种方式?(D)//等待是不是就绪状态? A CPU调度给优先级更高的线程B 阻塞的线程获得资源或者信号C 在时间片轮转的情况下,如果时间片到了D 获得spinlock未果我觉a是由运行态进入就绪态b是有阻塞太进入就绪态c是由就绪态进入运行态 d一直就绪态

请教多线程间等待的问题怎样实现比较简单?
最简单的方法就是在系统中设置全局标志,设置a结束标志, 1号线程结束了之后设置这个标志位,2号一直读取这个标志,如果没有ready就一直sleep(50)这种。3号同理。设置全局变量可以再一个3个线程都能读取到的地方设置,也可以做成一个包含a.b变量和标志的structure 作为参数传给3个线程. 事实上,a,b本身就可以作为标志,根据它的类型,比如不为null, 不为零之类的都可以作为上一个线程结束的标注。

如何等待线程结束
等待一个线程的结束 Win32 提供WaitForSingleObject()函数,其第一个参数是一个核心对象(如线程)的 handle。为方便讨论,把等待线程称为线程#1,把被等待线程称为线程#2。调用 WaitForSingleObject()并放置一个“线程句柄”作为参数,将使线程#1开始睡眠,直到线程#2结束。像Sleep()函数一样,WaitForSingleObject()也有一个参数用来指定最长的等待时间。DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);hHandle:等待对象的 handle(代表一个核心对象)。dwMilliseconds:等待的最长时间。时间终了,即使 handle尚未成为激发状态,此函数也要返回。此值可以是0(代表立刻返回),也可以是 INFINITE代表无穷等待。如果函数失败,返回WAIT_FAILED。这时可调用 GetLastError()取得更多信息。此函数的成功有三个因素:1. 等待的目标(核心对象)变成激发状态。返回值为WAIT_OBJECT_0。2. 核心对象变成激发状态之前,等待时间终了。返回值为WAIT_TIMEOUT。3. 如果一个拥有mutex(互斥器)的线程结束前没有释放mutex,则传回 WAIT_ABANDONED。(abandoned:废弃)获得一个线程对象的 handle之后,WaitForSingleObject()要求操作系统让线程 #1 睡眠,直到以下任何一种情况发生:1. 线程#2结束2. dwMilliseconds时间终了。该值系从函数调用后开始计算。由于操作系统持续追踪线程#2,即使线程#2 失事或被强迫结束,WaitForSingleObject()仍然能够正常运作。如果想一直等待某个线程,直到线程退出,可以用如下代码:WaitForSingleObject( hThrd, INFINITE );关于time-out,有一个特别重要的用途,但很少被人注意。设定time-out为0,能够检查handle的状态并立刻返回,没有片刻停留。如果handle已经备妥,那么这个函数会成功并传回 WAIT_OBJECT_0。否则,这个函数立刻返回并传回 WAIT_TIMEOUT。另外可以利用 time-out提供一个动画,表示正在等待某个线程的结束。可以每 500毫秒就time-out一次,更新图示,然后再继续等待。 WaitForSingleObject()可以面对许多种 handles工作,不一定非要是的线程 handle。事实上,Win32中大部分以HANDLE表示的对象都能够作为 WaitForSingleObject()的等待目标。视所拥有的对象不同,操作系统等待的事情也不一样。形式上来说,系统等待着这一对象“被激发”。

本文由 在线网速测试 整理编辑,转载请注明出处。