java线程堵_java多线程之堵塞的应用

线程在Running的过程中可能会遇到阻塞情况,上次的内容我们已经使用过sleep()的方法。

调用join()和sleep()方法,sleep()时间结束或被打断,join()中断,IO完成都会回到Runnable状态,等待JVM的调度。

调用wait(),使该线程处于等待池,等到线程被唤醒被放到锁定池,释放同步锁使线程回到可运行状态。

对Running状态的线程加同步锁使其进入,同步锁被释放进入可运行状态。

此外,在runnable状态的线程是处于被调度的线程,此时的调度顺序是不一定的。Thread类中的yield方法可以让一个running状态的线程转入runnable。

1.sleep()的应用:

我们知道sleep()是睡眠一段时间,然后再开始运行。

public void run() {

for(int i=0;i<10;i++) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("Wolf");

}

}

2.wait()方法实现线程阻塞的方法,我们称之为“线程等待”,方式有两种:

1)和sleep()方法一样,通过传入“睡眠时间”作为参数,时间到了就“醒了”;

2)不传入时间,进行一次“无限期的等待”,只用通过notify()方法来“唤醒”。

public static void main(String[] args) {

ThreadA t1 = new ThreadA("t1");

synchronized(t1) {

try {

// 启动“线程t1”

System.out.println(Thread.currentThread().getName()+" start t1");

t1.start();

// 主线程等待t1通过notify()唤醒。

System.out.println(Thread.currentThread().getName()+" wait()");

t1.wait(); // 不是使t1线程等待,而是当前执行wait的线程等待

System.out.println(Thread.currentThread().getName()+" continue");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值