让一个线程进入阻塞态有哪些方法?

本文介绍了Java中线程的几种重要方法,如sleep()、wait()、suspend()和join(),以及Java5以后通过Lock接口和Condition实现的高级等待/通知机制。特别提到了suspend()方法的弃用和join()方法的用途。还讨论了阻塞I/O操作导致的线程阻塞状态。
摘要由CSDN通过智能技术生成

sleep( )方法

使线程在一定的时间内进入阻塞状态,不能得到cpu时间,但不会释放锁资源。指定的时间一过,线程重新进入可执行状态。

wait( ) 方法

使线程进入阻塞状态,同时释放自己占有的锁资源,和notify( )搭配使用。

suspend( )方法

使线程进入阻塞状态,并且不会自动恢复,必须其对应的resume( )被调用,才能使线程重新进入可执行状态,(不建议用,容易发生死锁,该方法已被JDK弃用)。

join()方法

当主线程开启一个或多个子线程的时候,使用join方法,必须等该线程运行结束,主线程或其他子线程才由阻塞状态转为可执行状态。

通过Lock接口和Condition实现等待/通知机制

Java 5以后,可以使用Lock接口和Condition接口来实现等待/通知的高级用法。线程调用Condition的await()方法后会进入阻塞状态,直到其他线程调用Condition的signal()方法或signalAll()方法唤醒线程。

调用某些阻塞I/O方法

当线程执行阻塞I/O操作时(例如读取未就绪的Socket数据),线程会进入阻塞状态,直到I/O操作完成。

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果这两个方法锁的是同一个对象,那么当一个线进入其中一个方法并获得了锁之后,另一个线程就无法进入另一个方法,因为该对象已经被锁住了。只有当第一个线程释放锁之后,第二个线程才能获得锁并进入另一个方法。 如果这两个方法锁的是不同的对象,那么两个线程可以同时进入各自的方法,因为它们并没有竞争同一个锁。 ### 回答2: 在一个类中,如果两个方法都使用了锁来进行同步控制,当一个线进入了其中一个方法时,另一个线程将无法同时进入另一个方法。 当一个线进入了一个加锁的方法时,它会获取到该方法对应的锁,并且其他线程需要等待该锁的释放才能进入这个方法。这是因为锁的作用是保证同一时间只有一个线程能够执行加锁的方法,防止多个线程同时访问某个共享资源导致线程安全问题。 因此,即使类中有两个加锁的方法,当一个线程获取了其中一个方法的锁之后,另一个线程无法同时进入另一个方法,它需要等待第一个线程释放对应的锁才能继续执行。 总结起来,通过在需要同步控制的方法上加锁,可以确保在同一时间只有一个线程能够执行该方法,其他线程需要等待锁的释放才能进入方法。 ### 回答3: 一个类中有两个方法都加了锁,当一个线进入其中一个方法,另一个线程不能同时进入另一个方法。在Java中,加锁可以通过synchronized关键字实现,该关键字可以用来修饰方法或者代码块。当一个线进入了一个被synchronized修饰的方法,它会获得该方法的锁,并执行其中的代码。此时,其他线程如果想要进入同一个被synchronized修饰的方法,需要等待该锁的释放。因此,当一个线进入了第一个加锁方法,另一个线程不能同时进入第二个加锁方法。 实际上,加锁是为了保护共享资源的并发访问。当多个线程同时对某个共享资源进行读写操作时,为了避免出现竞条件和数据不一致的问题,可以使用锁机制确保同一时间只有一个线程能够访问共享资源。 在上述情况下,两个方法都加了锁,是为了保证同一时间只有一个线程能够执行这两个方法中的任意一个。如果一个线程已经获取了第一个方法的锁,那么第二个方法的锁就会被另一个线阻塞,直到第一个方法的锁被释放。只有当第一个方法的锁被释放后,另一个线程才能获取该锁,并进入第二个方法执行相关的代码。 因此,当一个线进入了一个方法,另一个线程不能同时进入另一个方法。只有等待第一个线程释放锁后,才能进行竞争获取锁资源。这样可以保证对共享资源的访问是线程安全的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值