并发编程(五)----常用方法(1)

sleep

  • 1.sleep作用让当前线程暂停指定的时间
  • 2.sleep只是暂时让出CPU执行权限,并不释放锁
  • 3.sleep由于对象锁没有被释放,其他线程仍然无法访问这个对象
  • 4.sleep不需要在同步的代码块中执行(wait方法必须在同步的代码块中执行)
  • 5.sleep可以用interrupt方法打断线程的暂停状态
  • 6.sleep只是线程的操作,用于短时间暂停线程,不涉及线程间通信
  • 7.sleep是Thread类的方法

wait

  • 1.wait()/notify()方法通常成对出现
  • 2.wait()/notify()方法需要获取对象锁方可调用
  • 3.wait()/notify()要写在同步代码块或者同步方法内
  • 4.一旦调用wait()方法,其他线程将可以访问这个对象
  • 5.当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去了对象的锁,可以允许其他的线程执行一些同步操作
  • 6.wait()可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出中断异常
  • 7.重获对象锁:a)设置wait()方法的参数,如wait(1000)表明借出去1秒钟后,自动收回锁b)让借锁的线程通知(notify)当前线程,借锁线程用完了马上就收回来
  • 8.wait()/notify()是Object的方法

notify/notifyall

  • 1.notify()唤醒在此对象监视器(对象锁)上等待的单个线程
  • 2.当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中
  • 3.该线程将等待从锁池中获得锁,然后回到wait()前的现场
  • 4.notifyAll()唤醒在此对象监视器上等待的所有线程
  • 5.唤醒的线程的顺序—LIFO
  • 6.wait()/notify()/notifyAll()涉及线程间的通信
    例子:
package com.hexy.thread.demo;

import java.text.SimpleDateFormat;
import java.util.Date;

public class ThreadDemo10 {
    static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

    public static void main(String[] args) {
        Object obj = new Object();
        for (int i = 0; i < 5; i++) {
            new WaitThread(i,obj).start();
        }
        new NotifyThread(obj).start();
    }
    static class WaitThread extends Thread{
        Object obj;
        public WaitThread(int i,Object obj) {
            setName("WaitThread"+i);
            this.obj = obj;
        }

        @Override
        public void run(){
            synchronized (obj){
                System.out.println(sdf.format(new Date() ) + "" + getName()+ " before wait()");
                try{
                   obj.wait();
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                System.out.println(sdf.format(new Date() )+  "" + getName()+ " after wait()");
            }
        }
    }
    static class NotifyThread extends Thread{
        Object obj;
        public NotifyThread(Object obj) {
            setName("NotifyThread");
            this.obj = obj;
        }

        @Override
        public void run(){
            synchronized (obj){
                try{
                    Thread.sleep(5000);
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println(sdf.format(new Date()) + " notifythread before notify()");
                obj.notifyAll();
                try{
                    Thread.sleep(5000);
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println(sdf.format(new Date() )+ " notifythread after notify()");
            }
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值