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主线程等待子线程执行完毕之后再执行
在你的主线程中用一个join的方法,你要等待谁,就用谁调用,比如,你要等待线程a结束,就用a.join();这样就可以了。记住哦,这条语句写在哪个线程里,哪个线程就要等待调用这个方法的其他线程。就是说,你在主线程里写了这条语句,那么主线程就要等待线程a执行完后,主线程才会执行。
让主线程等待,或着睡眠几分钟。用Thread.sleep()或者TimeUnit.SECONDS.sleep(5);

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结束标志, 1号线程结束了之后设置这个标志位,2号一直读取这个标志,如果没有ready就一直sleep(50)这种。3号同理。设置全局变量可以再一个3个线程都能读取到的地方设置,也可以做成一个包含a.b变量和标志的structure 作为参数传给3个线程. 事实上,a,b本身就可以作为标志,根据它的类型,比如不为null, 不为零之类的都可以作为上一个线程结束的标注。

如何使“主线程”等待“子线程”执行结束后再继续执行
主线程抛出一个子线程异步处理一些东西,这时主线程要等待子线程运行完成再完成(其实我是为了统计运行时间的)。
这里抛出的子线程可能递归的调用自己,就是再抛一个他的子线程出来,但是到底一共抛多少,事先是不知道的。
应用场景:1)多线程扫描文件夹内的文件,遇到文件夹内有子文件夹,要递归调用扫描线程的,等到全部扫描完成后,返回结果,显示;
2)多线程快速排序,第一次肯定是单线程的,第一次排序完成后,会分两半,这两半多线程排,递归调用了这个排序线程,这两半很有可能,极大有可能再各分两半,也就是会有4个子线程的子线程再排序。
我试过网上的那个 CountDownLatch ,但是他只能实现定义好子线程的数量,但是在以上两种情景下,事先你是不知道会有多少个子线程的!
PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。这个貌似也要在开始的时候设定总线程数:CyclicBarrier(int parties)
这个和countDownLatch就差不多了呢!
你觉得呢 问题补充:niuzai 写道亲,CyclicBarrier可能是你想要的。
PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。我再来看看~~试试看! 问题补充:niuzai 写道亲,CyclicBarrier这个东东是可以动态重置个数的,而countDownLatch是一次性的。只不过大多数例子CyclicBarrier初始化了个数罢了,实质上它是可以动态改变的~ 嗯 我试了下,多线程快排,小数据量还好,顺利执行了,但是数多了后,会建N多线程等待,会outofmemory,呵呵!
不过证明这个方法是可以的! 问题补充:niuzai 写道亲,那你就结合线程池操作,设置线程数目上限。不要每个任务就产生一个线程咯~ 产生新的线程是很耗内存的,线程太多当然就内存溢出咯~嗯 你说的很对!要结合线程池的!

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