线程等待的方法(线程等待的方法wait和sleep)

      最后更新:2023-09-17 10:52

      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线程wait方法

      如何实现java主线程等待子线程执行完毕之后再执行

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

      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 所说,等待线程结束势必要挂起当前线程,也就没必要用线程了,也许需要重新考虑一下这种实现方式。
      有这种需求用什么线程,线程就是做异步处理的。
      java关于等待线程结束的问题!

      请教多线程间等待的问题怎样实现比较简单?

      最简单的方法就是在系统中设置全局标志,设置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 写道亲,那你就结合线程池操作,设置线程数目上限。不要每个任务就产生一个线程咯~ 产生新的线程是很耗内存的,线程太多当然就内存溢出咯~嗯 你说的很对!要结合线程池的!
      如何使“主线程”等待“子线程”执行结束后再继续执行

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

          热门文章

          文章分类