线程之wait()/notify()/notifyAll()/sleep()/join()/yield()

wait()/notify()/notifyAll()
  • 方法来自object类,必须在synchronized中执行,否则会抛异常

  • wait()

    • 调用该方法会使当前线程处于等待唤醒状态,释放对象锁以及占用的资源,交给其它线程使用,该线程会加入等待唤醒队列中,
  • notify()/notifyAll()

    • 用于从等待唤醒队列中唤醒线程。notify()是唤醒队列中的头一个;notifyAll()会会唤醒队列中的所有线程,但是哪个线程先执行,这个是不确定的。

         	final String str = new String("王龙");
         	        Thread t1 = new Thread(new Runnable() {
         	            @Override
         	            public void run() {
         	                synchronized (str){
         	                    try {
         	                        for (int i = 0 ; i<10 ; i++) {
         	                            Thread.sleep(1000);
         	                            Log.e(str,"线程1"+i);
         	                            if (i==5){
         	                                person.wait();
         	                            }
         	                        }
         	                    } catch (InterruptedException e) {
         	                        e.printStackTrace();
         	                    }
         	                }
         	            }
         	        },"Thread1");
         	        Thread t2 = new Thread(new Runnable() {
         	            @Override
         	            public void run() {
         	                synchronized (person){
         	                    try {
         	                        for ( int i = 0 ; i < 10 ; i++ ){
         	                            Thread.sleep(1000);
         	                            Log.e(str,"线程2"+i);
         	                            if (i==5){
         	                                person.notify();
         	                            }
         	                        }
         	                    } catch (InterruptedException e) {
         	                        e.printStackTrace();
         	                    }
         	
         	                }
         	            }
         	        },"Thread2");
         	        t1.start();
         	        t2.start();
      
  • 线程1先执行,线程2处于等待状态;线程1会循环遍历,当i5的时候,调用wait()方法,使线程1处于等待状态,这时候线程2会获取资源使用权,执行循环遍历,当i5时,让线程1从等待唤醒队列中唤醒,但是当前线程2任然占用资源使用权,所以会继续实现线程2 的循环遍历,当线程2执行完成之后,就会轮到线程1执行

sleep() 休眠
  • 方法来自Thread类,调用该方法使该线程休眠指定的时间,休眠指定的时间后继续执行,该线程并没有释放对象锁,会释放资源使用权

       Thread(Runnable {
                  Log.i("Main","子线程1")
                  Thread.sleep(10000)
                 Log.i("Main","休眠")
              }).start()
      
      Thread(Runnable {
                  Log.i("Main","子线程2")
              }).start()
    
    
      //打印结果 
      03-21 07:22:01.300 2028-2041/project.com.tinkertest.debug I/Main: 子线程1
      03-21 07:22:01.308 2028-2042/project.com.tinkertest.debug I/Main: 子线程2
      03-21 07:22:02.896 548-563/system_process I/ActivityManager: Displayed project.com.tinkertest.debug/project.com.tinkertest.MainActivity: +1s795ms
      03-21 07:22:11.303 2028-2041/project.com.tinkertest.debug I/Main: 休眠
    
join() 阻塞
  • 方法来自Thread类,调用该方法会让指定的线程先执行,然后执行其他线程。

         val thread1= Thread(Runnable {
               Log.i("Main","子线程1")
               Thread.sleep(10000)
              Log.i("Main","休眠")
           })
           thread1.start()
           thread1.join()
    
           Log.i("Main","主线程需要等待")
          val thread2= Thread(Runnable {
               Log.i("Main","子线程2")
           })
           thread2.start()
           thread2.join()
           Log.i("Main","主线程")
    
       //打印结果
       03-21 08:03:31.724 2426-2439/project.com.tinkertest.debug I/Main: 子线程1
       03-21 08:03:41.724 2426-2439/project.com.tinkertest.debug I/Main: 休眠
       03-21 08:03:41.724 2426-2426/project.com.tinkertest.debug I/Main: 主线程需要等待
       03-21 08:03:41.724 2426-2444/project.com.tinkertest.debug I/Main: 子线程2
       03-21 08:03:41.724 2426-2426/project.com.tinkertest.debug I/Main: 主线程
    
yield() 礼让
  • 本地方法,调用该方法会让线程进入就绪状态,当前线程会让出资源,将资源交给其他线程使用,通常是交给优先级别相同或者优先级别较高线程。至于当前线程什么时候再次获取资源用于使用权是不确定的。

     	     val thread1= MyThread()
     	        val thread2=MyThread()
     	        thread1.start()
     	        thread2.start()
    
     	
     	    class  MyThread : Thread(){
     	
     	        override fun run() {
     	            super.run()
     	            for (i in 0 .. 100) {
     	                Log.i("Main",getName() + "在运行,i的值为:" + i + " 优先级为:" + getPriority());
     	                if (i == 2) {
     	                    Log.i("Main",getName() + "礼让");
     	                    Thread.yield();
     	                    try {
     	                        Thread.sleep(1000);
     	                    }catch (e:InterruptedException){
     	                        e.printStackTrace();
     	                    }}
     	
     	                }
     	        }
     	    }
    
         //打印日志
     	03-21 08:59:22.394 2688-2701/project.com.tinkertest.debug I/Main: Thread-126在运行,i的值为:0 优先级为:5
     	03-21 08:59:22.394 2688-2701/project.com.tinkertest.debug I/Main: Thread-126在运行,i的值为:1 优先级为:5
     	03-21 08:59:22.394 2688-2701/project.com.tinkertest.debug I/Main: Thread-126在运行,i的值为:2 优先级为:5
     	03-21 08:59:22.394 2688-2701/project.com.tinkertest.debug I/Main: Thread-126礼让
     	03-21 08:59:22.394 2688-2702/project.com.tinkertest.debug I/Main: Thread-127在运行,i的值为:0 优先级为:5
     	03-21 08:59:22.394 2688-2702/project.com.tinkertest.debug I/Main: Thread-127在运行,i的值为:1 优先级为:5
     	03-21 08:59:22.394 2688-2702/project.com.tinkertest.debug I/Main: Thread-127在运行,i的值为:2 优先级为:5
     	03-21 08:59:22.394 2688-2702/project.com.tinkertest.debug I/Main: Thread-127礼让
     	03-21 08:59:23.394 2688-2701/project.com.tinkertest.debug I/Main: Thread-126在运行,i的值为:3 优先级为:5
     	03-21 08:59:23.394 2688-2701/project.com.tinkertest.debug I/Main: Thread-126在运行,i的值为:4 优先级为:5
     	03-21 08:59:23.394 2688-2701/project.com.tinkertest.debug I/Main: Thread-126在运行,i的值为:5 优先级为:5
    
  • 首先线程1执行,当i2,线程1进入就绪状态,将资源交给线程2,线程2执行,当i2时,在将使用权交给线程1,执行后续循环,最后再执行线程2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值