精华内容
下载资源
问答
  • 线程阻塞方法
    千次阅读
    2018-03-29 13:55:54

     

    sleep方法:顺序进入同步块的,不释放锁,持有monitor对象锁,其他线程是不能进入的。//忍让一段时间
    wait方法:当调用wait方法后,当前线程会释放持有的monitor对象锁,因此,其他线程还可以进入到同步方法,线程被唤醒后(如果加时间参数的话,则会在时间被消耗后唤醒,否则需要通过notify或notifyall唤醒),需要竞争锁,获取到锁之后再继续执行。//无条件忍让
    yield方法:放弃当前时间片,将Running状态转变为Runnable状态,不能指定多长时间。//假装忍让,不确定是不是真的忍让,完成具有不确定性不受监督的切换
    join方法:类似sleep,停止当前线程,让join线程先执行完毕,或执行指定的时间。//插队
    更多相关内容
  • Java中什么方法导致线程阻塞

    万次阅读 多人点赞 2018-03-24 16:45:41
    一、为什么引入线程阻塞机制? 为了解决对共享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对共享资源的访问,显然同步机制已经不够了,因为在任意时刻所要求的资源不一定已经准备好了被访问...

    一、为什么引入线程阻塞机制?

    为了解决对共享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对共享资源的访问,显然同步机制已经不够了,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了的资源也可能不止一个。为了解决这种情况下的访问控制问题,Java 引入了对阻塞机制的支持

    阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),学过操作系统的同学对它一定已经很熟悉了。Java 提供了大量方法来支持阻塞,下面让我们逐一分析。

    二、Java中实现线程阻塞的方法:

    (1)线程睡眠:Thread.sleep (long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。

    (2)线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify() 唤醒方法。这个两个唤醒方法也是Object类中的方法,行为等价于调用 wait() 一样。wait() 和 notify() 方法:两个方法配套使用,wait() 使得线程进入阻塞状态,它有两种形式,一种允许 指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的 notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用.

    (3)线程礼让,Thread.yield() 方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程.

    (4)线程自闭,join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。

    (5)suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。Thread中suspend()和resume()两个方法在JDK1.5中已经废除,不再介绍。因为有死锁倾向

    这里,笔者放入一张线程生命周期的经典图片,来帮助读者理解,里面展示了一个线程从创建->运行->阻塞->运行->死亡的全过程:

    三、常用线程名词解释

    主线程:JVM调用程序main()所产生的线程。

    当前线程:这个是容易混淆的概念。一般指通过Thread.currentThread()来获取的进程。

    后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束

    前台线程:是指接受后台线程服务的线程,其实前台后台线程是联系在一起,就像傀儡和幕后操纵者一样的关系。傀儡是前台线程、幕后操纵者是后台线程。由前台线程创建的线程默认也是前台线程。可以通过isDaemon()和setDaemon()方法来判断和设置一个线程是否为后台线程。

    可见进程:可见进程是指一些不在前台,但用户依然可见的进程,举例来说:各种widget、输入法等,都属于visibe。这部分进程虽然不在前台,但与我们的使用也是密切相关,我们并不希望它被系统终止。

    “前台可见进程服务于后台空进程”——这是记录线程重要性的口诀,

    重要性一次递减即,前台进程>可见进程>服务进程>后台进程>空进程。

    线程类的一些常用方法

    sleep(): 强迫一个线程睡眠N毫秒。

    isAlive(): 判断一个线程是否存活。

    join(): 等待线程终止。

    activeCount(): 程序中活跃的线程数。

    enumerate(): 枚举程序中的线程。

    currentThread(): 得到当前线程。

    isDaemon(): 一个线程是否为守护线程。

    setDaemon(): 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束)

    setName(): 为线程设置一个名称。

    wait(): 强迫一个线程等待。

    notify(): 通知一个线程继续运行。

    setPriority(): 设置一个线程的优先级。

    感兴趣的读者可以参考下笔者的另外一篇文章:

    >>>---《Java线程阻塞方法sleep()和wait()精炼详解》

    展开全文
  • Java中实现线程阻塞方法

    千次阅读 2020-06-23 17:56:51
    Java中实现线程阻塞方法线程睡眠:Thread.sleep (long millis)线程等待:Object类中的wait()方法线程礼让,Thread.yield() 方法线程自闭,join()方法 线程睡眠:Thread.sleep (long millis) 使线程转到阻塞状态。...

    线程睡眠:Thread.sleep (long millis)

    使线程转到阻塞状态。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。

    线程等待:Object类中的wait()方法

    导致当前的线程等待,直到其他线程调用此对象的 notify() 唤醒方法。wait() 使得线程进入阻塞状态,它有两种形式,一种允许 指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的 notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用。

    线程礼让,Thread.yield() 方法

    暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。

    线程自闭,join()方法

    等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个线程运行结束,当前线程再由阻塞转为就绪状态。

    展开全文
  • C++线程同步——阻塞线程方法

    千次阅读 2021-08-29 21:09:05
    sem_wait() 会阻塞当前线程 sem_trywait() 返回错误而不是阻塞调用 sem_timedwait() sem_timedwait的abs_timeout参数指定了调用应该阻塞的时间限制 信号量 信号量 (semaphore) 是一种轻量的同步原件,用于制约对...

    一般,使线程阻塞我们可以使用 while(condition); for(;condition;); 等循环条件使之线程内语句执行在循环处无法向下继续执行,但这样并不是真正意义上的线程阻塞,当前线程仍然在执行,只是在循环语句处不断空耗CPU

    在C中有信号量、互斥量、条件变量、读写锁等可用于线程同步,他们都有对应的可以使之线程阻塞的方法。

    例如C的信号量。C头文件 <semaphore.h>中

    • sem_wait() 会阻塞当前线程
    • sem_trywait() 返回错误而不是阻塞调用
    • sem_timedwait() sem_timedwait的abs_timeout参数指定了调用应该阻塞的时间限制

    在C++中主要有以下方法:
    信号量
    信号量 (semaphore) 是一种轻量的同步原件,用于制约对共享资源的并发访问。在可以使用两者时,信号量能比条件变量更有效率。

    定义于头文件 <semaphore>
    counting_semaphore 实现非负资源计数的信号量
    binary_semaphore 仅拥有二个状态的信号量(typedef)

    其中

    • acquire 减少内部计数器或阻塞到直至能如此
    • try_acquire 尝试减少内部计数器而不阻塞
    • try_acquire_for 尝试减少内部计数器,至多阻塞一段时长
    • try_acquire_until 尝试减少内部计数器,阻塞直至一个时间点

    互斥
    互斥算法避免多个线程同时访问共享资源。这会避免数据竞争,并提供线程间的同步支持。

    定义于头文件 <mutex>

    • lock 锁定互斥,若互斥不可用则阻塞 ,其中lock可锁定多个mutex对象,并内置免死锁算法避免死锁。
    • try_lock 尝试锁定互斥,若互斥不可用则返回 (不阻塞)
    • unlock 解锁互斥

    通常不直接使用 std::mutex ,一般使用 std::unique_lock 、 std::lock_guard 或 std::scoped_lock 互斥器管理器使用。

    • lock_guard 实现严格基于作用域的互斥体所有权包装器
    • scoped_lock 用于多个互斥体的免死锁 RAII 封装器
    • unique_lock 实现可移动的互斥体所有权包装器

    条件变量
    条件变量是允许多个线程相互交流的同步原语。它允许一定量的线程等待(可以定时)另一线程的提醒,然后再继续。条件变量始终关联到一个互斥。

    定义于头文件 <condition_variable>

    condition_variable 类是同步原语,能用于阻塞一个线程,或同时阻塞多个线程,直至另一线程修改共享变量(条件)并通知 condition_variable 。

    有意修改变量的线程必须

    1. 获得 std::mutex (常通过 std::lock_guard )
    2. 在保有锁时进行修改
    3. 在 std::condition_variable 上执行 notify_one 或 notify_all (不需要为通知保有锁)
      即使共享变量是原子的,也必须在互斥下修改它,以正确地发布修改到等待的线程。

    由上可得,条件变量在线程同步时,需要获得互斥量才能进行。而 unique_lock 这个互斥器管理器允许自由的unlock,所以一般条件变量与unique_lock一起使用。

    • wait 、 wait_for 或 wait_until ,等待操作自动释放互斥,并悬挂线程的执行(阻塞)。
      在这里插入图片描述

    Future
    标准库提供了一些工具来获取异步任务(即在单独的线程中启动的函数)的返回值,并捕捉其所抛出的异常。这些值在共享状态中传递,其中异步任务可以写入其返回值或存储异常,而且可以由持有该引用该共享态的 std::future 或 std::shared_future 实例的线程检验、等待或是操作这个状态。

    • get 返回结果 ,get 方法等待直至 future 拥有合法结果并(依赖于使用哪个模板)获取它。它等效地调用 wait() 等待结果。(阻塞
    • wait 等待结果变得可用 。阻塞直至结果变得可用。调用后 valid() == true 。
    • wait_for 等待结果,如果在指定的超时间隔后仍然无法得到结果,则返回。 阻塞直至经过指定的 timeout_duration,或结果变为可用
    • wait_until 等待结果,如果在已经到达指定的时间点时仍然无法得到结果,则返回。阻塞直至抵达指定的 timeout_time ,或结果变为可用

    this_thread
    在this_thread命名空间下,有this_thread::sleep_for、this_thread::sleep_until、this_thread::yield 三个方法。

    其中前两个可以通过让线程睡眠一段时间而达到阻塞线程的目的。

    后者,可以通过一定的条件使得当前线程让度给其他线程达到阻塞的目的。while (condition) this_thread::yield();

    原子操作(CAS)

    此外,使用原子量实现自旋锁,也可以在一定时间内阻塞线程。

    class CAS	// 自旋锁
    {
    private:
    	std::atomic<bool> flag;	// true 加锁、false 无锁
    public:
    	CAS() :flag(true) {}   // 注意这里初始化为 true,因此,第一次调用 lock()就会阻塞
    	~CAS() {}
    	CAS(const CAS&) = delete;
    	CAS& operator=(const CAS&) = delete;
    
    	void lock()	// 加锁
    	{
    		bool expect = false;
    		while (!flag.compare_exchange_strong(expect, true))
    		{
    			expect = false;
    		}
    	}
    	void unlock()
    	{	
    		flag.store(false);
    	}
    };
    
    展开全文
  • Java线程阻塞方法sleep()和wait()精炼详解

    万次阅读 多人点赞 2018-04-10 22:53:58
    感兴趣的读者可以参见笔者之前的文章《Java中什么方法导致线程阻塞》,里面详细讲述了为什么Java要造成线程阻塞和Java中造成线程阻塞的几种方法。 线程的生命周期 这是笔者在谷歌图片中找到的一张简单描述线程...
  • java线程几种阻塞方法对比

    千次阅读 2020-09-27 09:40:29
    通过上图中的线程生命周期图可知,常用的几种阻塞方法主要: Thread.sleep(), LockSupport.park(), Object.wait 阻塞方法对比 在这里插入图片描述 Object.wait()相关 方法 描述 Object.wait() 阻塞当前...
  • 如果线程是因为调用了wait()、sleep()或者join()方法而导致的阻塞,可以中断线程,并且通过抛出... sleep() 方法sleep(毫秒),指定以毫秒为单位的时间,使线程在该时间内进入线程阻塞状态,期间得不到cp...
  • Java线程阻塞和唤醒的几种方式

    千次阅读 2020-12-17 10:04:09
    调用wait()方法后,线程将被阻塞,wait()方法将会释放当前持有的监视器锁(monitor),直到有线程调用notify/notifyAll()方法后方能继续执行。 notify/notifyAll()方法只是解除了等待线程阻塞,并不会马上释放监视器...
  • js阻塞线程方法

    千次阅读 2020-08-07 11:47:02
    var timeOutFunc = () => { return new Promise((a, b) => { setTimeout(async () => { console.log(2) await timeOutFunc... } await timeOutFunc() console.log(3) 执行上面的代码会阻塞住,无限打印2,不会打印1和3
  • 线程阻塞方式:  1、join 2、sleep 3、yield 4、改变线程的优先级 5、将线程设置成守护线程(jvm中的垃圾回收线程) 参考:https://blog.csdn.net/liyuchong2537631/article/details/51900198 ...
  • java线程阻塞问题排查方法

    千次阅读 2019-04-17 16:55:38
    java线程阻塞问题排查方法
  • 另一个线程是无法获取到CPU执行权的(调用sleep方法是进入到睡眠暂停状态,但是CPU执行权并没有交出去,而调用wait方法则是将CPU执行权交给另一个线程),这个时候就会造成线程阻塞。 为什么会出现线程阻塞? 1....
  • java 基础--线程阻塞的原因

    千次阅读 2021-02-25 19:29:24
    1. 线程在运行的过程中因为某些原因而发生阻塞阻塞状态的线程的特点是:该线程放弃CPU的使用,... 导致阻塞的原因很多种,大致分为三种来讨论,分别是一般线程中的阻塞,Socket客户端的阻塞,Socket服务器端的阻...
  • 实现Java阻塞有哪些方法

    千次阅读 2019-01-22 16:47:25
    如果线程是因为调用了wait()、sleep()或者join()方法而导致的阻塞,可以中断线程,并且通过抛出InterruptedException来唤醒它;...sleep(毫秒),指定以毫秒为单位的时间,使线程在该时间内进入线程阻塞状态,期间得...
  • 你知道线程阻塞方式吗?

    千次阅读 2020-05-19 10:38:17
    如A线程执行体中调用B线程的join()方法,则A线程阻塞,直到B线程执行完为止,A才能得以继续执行  2、sleep sleep —— 让当前的正在执行的线程暂停指定的时间,并进入阻塞状态。在其睡眠的时间段内,该线程...
  • 什么导致线程阻塞

    千次阅读 2019-07-25 13:07:14
    导致线程阻塞的原因主要以下几方面。 1、线程进行了休眠:线程执行了Thread.sleep(int n)方法,线程放弃CPU,睡眠n毫秒,然后恢复运行。 2、线程等待获取同步锁才能进行下一步操作:线程要执行一段同步代码,由于...
  • 二、线程阻塞BLOCKED和等待WAITING的区别 阻塞BLOCKED 等待WAITING 不知羞耻的摘录 一、 sleep()和wait()方法的区别 sleep()方法 sleep()方法是Thread类的方法,通过其定义可知是个native方法,在指定的时间...
  • java处理线程阻塞的小技巧

    万次阅读 2017-11-29 14:27:04
    在java中我们使用多线程去处理一些业务,如果业务比较复杂且当并发量挺大的时候,很可能出现线程阻塞的问题。案例: 一个触发接口,根据触发的信息内部开启多个线程去执行业务,每个线程都会去执行两种业务:...
  • 什么导致线程阻塞

    千次阅读 2017-08-27 10:07:37
    阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的...方法,当前线程放弃CPU,睡眠一段时间,然后再恢复执行 2)线程执行一段同步代码,但是尚且无法获得相关的同步锁,只能进入阻塞状态
  • wait线程阻塞

    千次阅读 2018-09-16 19:12:40
    线程阻塞通常是指一个线程在执行过程中由于某种原因从运行状态转为暂停状态的过程,线程阻塞会放弃CPU的使用权, 并且等待某个条件重新从暂停状态改为就绪状态。在Java中,通常使用object.wait让线程进入阻塞状态。 ...
  • Java 线程阻塞、中断及优雅退出

    万次阅读 2017-06-12 19:54:17
    线程阻塞一个线程进入阻塞状态的原因可能如下(已排除Deprecated方法):sleep()sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给...
  • C++多线程的原子操作、线程阻塞

    千次阅读 2018-11-29 21:55:59
    头文件#include &lt;Thread&gt;及原子操作 ...在多线程中,由于进程的多个线程都是共享该进程的所有资源,那么如果多个线程访问同一个资源时,可能会出现问题。 如果多个线程都是只读操作,...
  • 进程与线程 阻塞与非阻塞

    千次阅读 2018-04-16 20:22:34
    每样菜具体包含了哪些内容(cpu每个进程中的线程):宫保鸡丁(详情:黄瓜、胡萝卜、鸡肉、花生米)。而详情构成了宫保鸡丁这道菜,吃了以后不饿。就可以干活了,cpu中的进程里的线程也是同理。当线程完成自己的内容将...
  • 如A线程执行体中调用B线程的join()方法,则A线程阻塞,直到B线程执行完为止,A才能得以继续执行。 1 public class ThreadTest { 2 3 public static void main(String[] args) { 4 5 MyRunnab
  • 前言:在某些应用场景下,我们可能需要等待某个线程执行完毕,然后才能进行后续的操作。...这里,介绍几个常用的方法线程执行单次的场景下1,利用Thread类的join()方法package concurrent;import java.util.Array
  • 使线程进入阻塞状态的方法

    千次阅读 2019-10-21 22:58:15
    sleep( ) 使线程在一定的时间内进入阻塞状态,不能得到cpu时间,但不会释放锁资源。指定的时间一过,线程重新进入可执行状态 wait( )使线程进入阻塞状态,同时释放自己占有的锁资源,和notify( )搭配使用 ...
  • JAVA多线程阻塞

    万次阅读 多人点赞 2017-02-13 17:15:33
    四、线程状态转换 下面的这个图非常重要!你如果看懂了这个图,那么对于多线程的理解将会更加深刻! ...1、新建状态(New):新创建了一...2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()
  • 线程阻塞的原因

    千次阅读 2018-01-29 19:05:47
    线程在运行的过程中因为某些原因而发生阻塞阻塞状态的线程的特点是:该... 导致阻塞的原因很多种,大致分为三种来讨论,分别是一般线程中的阻塞,Socket客户端的阻塞,Socket服务器端的阻塞。 一般线程中的阻塞

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 523,549
精华内容 209,419
关键字:

线程阻塞方法有哪些