精华内容
下载资源
问答
  • 多线程状态转换

    2020-05-30 19:57:49
    当前线程持有锁资源进入阻塞状态-------->sleep 时间到,解除阻塞状态 ②t.join ---->其他线程进入阻塞状态--------->执行当前线程 ③t.wait------>当前线程释放锁资源,进入等待队列。----.

    在这里插入图片描述
    (初始状态)
    Thread t = new Thread------t.start() --→Runnable(可运行状态,cpu分配时间片,等由cpu调度)------>运行状态------->
    ①t.sleep(mins)---->当前线程持有锁资源进入阻塞状态-------->sleep 时间到,解除阻塞状态
    ②t.join ---->其他线程进入阻塞状态--------->执行当前线程
    ③t.wait------>当前线程释放锁资源,进入等待队列。------>其他线程调用notify() 或者notifyall() 唤醒等待队列的线程进入线程就绪状态。

    多线程俩种资源,cpu分配时间片是一种资源,线程对资源加锁:称为加锁资源
    sleep俩种资源都不会释放,yeild释放cpu时间片资源
    相同点:

    1. 都会暂缓执行当前线程;
    2. 如果已经持有锁,那么在等待过程中都不会释放锁;

    不同点在于:

    1. Thread.sleep()可以精确指定休眠的时间,而Thread.yield()依赖于CPU的时间片划分,在我的电脑上大约为20微秒;
    2. Thread.sleep()会抛出中断异常,且能被中断,而Thread.yield()不可以;

    join()
    Thread的非静态方法join()让一个线程等待另外一个线程完成才继续执行。如果线程A执行体中调用B线程的join()方法,则A线程将会被阻塞,直到B线程执行完为止,A才能得以继续执行。

    Sleep() 方法:不会释放锁
    Sleep——让当前正在执行的线程先暂停一定的时间,并进入阻塞状态。在其睡眠的时间段内,该线程由于不是处于就绪状态,因此不会得到执行的机会。即使此时系统中没有任何其他可执行的线程,处于sleep()中的线程也不会执行。因此sleep()方法常用来暂停线程的执行。当sleep()结束后,然后转入到 Runnable(就绪状态),这样才能够得到执行的机会。

    Yield()方法:线程让步 不会释放锁
    让一个线程执行了yield()方法后,就会进入Runnable(就绪状态),【不同于sleep()和join()方法,因为这两个方法是使线程进入阻塞状态】。除此之外,yield()方法还与线程优先级有关,当某个线程调用yield()方法时,就会从运行状态转换到就绪状态后,CPU从就绪状态线程队列中只会选择与该线程优先级相同或者更高优先级的线程去执行

    在这里插入图片描述

    展开全文
  • Java 多线程状态转换

    2016-07-20 14:10:30
    Java 多线程状态转换


    线程基本状态图

        图中是线程运行的基本状态:线程调用start()方法开始后,就进入到可运行状态,随着CPU的资源调度在运行和可运行之间切换;遇到阻塞则进入阻塞状态。二三的状态图中只不过线程被阻塞的情况分为很多种,后面的图是细化说明。  

    New --> Runnable

        当一个线程执行了start方法后,不代表这个线程就会立即被执行,只代表这个线程处于可运行的状态,最终由OS的线程调度来决定哪个可运行状态下的线程被执行。 

    Running --> Runnable

    • Thread.yield()
    • 一个线程一次被选中执行是有时间限制的,这个时间段叫做CPU的时间片,当时间片用完但线程还没有结束时,这个线程又会变为可运行状态,等待OS的再次调度;

    Running --> Blocked

    • 在一个运行中的线程等待用户输入
    • 调用Thread.sleep()
    • 调用了其他线程的join()方法

    Blocked --> Runnable

    • 阻塞状态的线程用户输入完毕
    • sleep时间到
    • join的线程结束


    同步的线程状态图

    Lock pool --> Runnable

    当资源被一个线程访问时,上锁,其他线程就进入了一个锁池(Lock pool)当锁被释放,其他线程获得了锁,就变为可运行状态。


    加入线程间的相互作用  

                   
      线程调用了wait()方法之后,释放掉锁,进入等待池(Wait pool) ;收到通知之后等待获取锁,获取锁之后才可以运行。

     

    线程被阻塞可能是由于下面五方面的原因:(《Thinking in Java》)

    1.调用sleep(毫秒数),使线程进入睡眠状态。在规定时间内,这个线程是不会运行的。

    2.用suspend()暂停了线程的执行。除非收到resume()消息,否则不会返回“可运行”状态。

    3.用wait()暂停了线程的执行。除非线程收到notify()或notifyAll()消息,否则不会变成“可运行”状态。

    4.线程正在等候一些IO操作完成。

    5.线程试图调用另一个对象的“同步”方法,但那个对象处于锁定状态,暂时无法使用。


    线程同步各个方法的区别

    • Thread.yield()当前运行的线程变成可运行状态。
    • t2.join() 使得当前线程处于阻塞状态直到t2线程执行完毕。
    • Thread.sleep()使得当前线程处于阻塞状态直到sleep的时间结束。
    • wait、notify、notifyAll方法是Object类的方法,其调用环境必须有synchronized的同步块中调用,否则会抛java.lang.IllegalMonitorStateException异常。

     

    展开全文
  • 线程状态装换图 New 创建状态 Runnable 可运行状态(调用了start()方法,线程分配好了系统资源,调用run()方法,此时还没由获得cpu资源) Running 运行状态(抢占到了cpu资源) ...2.多线程状态转换 ...

    线程状态装换图


    New 创建状态

    Runnable 可运行状态(调用了start()方法,线程分配好了系统资源,调用run()方法,此时还没由获得cpu资源)

    Running 运行状态(抢占到了cpu资源)

    Dead 消亡状态(线程运行完毕,或者异常)


    2.多线程状态转换



    展开全文
  • 多线程状态转换图 关键词  Synchronized  简述:  在Java中,每一个对象都拥有一个锁标记(monitor),也称为监视器,多线程同时访问某个对象时,线程只有获取 了该对象的锁才能访问。所以synchronized 是...

    多线程状态转换图

    关键词

          Synchronized

                     简述:

                          在Java中,每一个对象都拥有一个锁标记(monitor),也称为监视器,多线程同时访问某个对象时,线程只有获取 了该对象的锁才能访问。所以synchronized 是一个悲观锁。

                    使用方法:

                          修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁(monitor)。

                          修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁(monitor)。

                          修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁(monitor)。

          volatile变量

                    并发编程三要素:

                          原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

                          可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

                          有序性:即程序执行的顺序按照代码的先后顺序执行。在多线程下,可能会导致程序以不正确的顺序执行。

                   volatile关键字作用

                          使某个变量取消线程缓存机制,使多个线程操作同一个变量,而不是各自修改副本,并有以下作用。

                                  1.保证了不同线程对这个变量进行操作时的可见性,一个值的改变,其他线程立马可见。

                             2.防止进行指令重排序。

           start方法

                         start()方法是Thread的类方法,尝试通过JVM产生线程。注意:start只是把线程切换为就绪态,几个线程顺序start无法保证顺序执行。

           yield方法

                         yield()被称为退让,让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。不会让出资源锁。

           sleep方法

                         sleept()方法是Thread的类方法,使用sleep方法使线程进入阻塞状态,到达时间后进入就绪状态,不会让出锁,只会让出CPU。

           join方法

                          join()方法是Thread的类方法,实际把多线程的并行操作,变成串行操作。“主”线程实际调用了wait方法,进入阻塞状态,在子线程运行结束后,主线程重新回到就绪状态。

           wait方法

                          wait()方法是object的类方法,因为需要获取到对象的监视器。所以同时也得在Synchronized代码块内。使用此方法使线程进入等待队列和阻塞状态。需要使用notify/notifyAll唤醒进入锁池/同步队列。才有可能获得锁,进入就绪状态。相当于PV操作中的P操作。

           notify/notifyAll方法

                          notify()/notifyAll()方法是object的类方法,因为需要获取到对象的监视器。所以同时也得在Synchronized代码块内。使用此方法可以唤醒该对象的等待队列中一个线程,notifyAll则唤醒所有。相当于PV操作中的V操作。   

    相关算法

         CAS算法

                      CAS是英文单词Compare And Swap的缩写,是一个乐观锁,非阻塞算法,需要volatile变量。

                      CAS原理:通过把并发问题转嫁成原子操作,利用CPU或者说是JVM指令实现。

                      CAS过程:需要三个值 内存 预期值 新的值,如果不符合预期值,就终止操作,循环下一次操作。

                      CAS缺点:

                                     1:ABA问题:可以通过追加版本号解决。

                                     2:高并发问题时:大部分线程全部操作失败,占用大量资源,且效果很差。

                                     3:只能保证一个共享变量的原子操作:可以将多个变量视作一个对象,一起操作。

    引用出处

              Synchronized部分内容  https://www.cnblogs.com/dolphin0520/p/3923737.html 

                                                    https://blog.csdn.net/javazejian/article/details/72828483

              yield方法  https://blog.csdn.net/Terrence_he/article/details/78333753

                               https://www.cnblogs.com/xudilei/p/6867045.html

    展开全文
  • java多线程状态转换

    2017-06-27 15:53:00
    1、新建状态(New):新创建了一个线程对象。 2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。 3、运行状态...
  • Java多线程状态转换

    2017-04-12 09:48:47
    线程状态类型 1. 新建状态(New):新创建了一个线程对象。 2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。...
  • Java多线程状态转换

    2012-08-06 11:38:25
    线程变化的状态转换图如下:  1、新建状态(New):新创建了一个线程对象。  2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取...
  • 阻塞状态:在以下几种情况下,线程状态转换为阻塞状态:1)线程调用了wait方法;2)线程调用了sleep方法;3)线程调用了join方法;4)线程未获得同步锁;5)线程中只用了阻塞IO的情况; 结束状态:通常为线程...
  • 线程状态转换图:两幅图仅是表现形式不同; 线程状态转化图一: 线程转换状态图二: 线程的几种状态: 新建状态(New): 用new语句创建的线程处于新建状态,此时它和其它java对象一样,仅仅在堆中分配了内存。 ...
  • 文章目录线程状态转换的注意点线程阻塞状态的定义 线程状态转换的注意点 根据下面的线程状态图, 可以看到 有些线程的状态是无法相互的转换的 . 例如无法从runnable回到new的状态. 而线程图的右侧是可以来回往复的. ...
  • Java多线程以及线程状态转换 Java实现多线程的方式: 1 继承Thread类,重写run方法。 class MyThread extends Thread{ public void run(){ System.out.println(Thread.currentThread().getName()+"MyThread.run()!...
  • 一、线程生命周期的五种状态 线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。 二、线程状态转换...
  • Java多线程线程状态转换、控制线程和线程同步
  • 线程状态转换 1、新建状态(New):新创建了一个线程对象。 2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权...
  • 大家好,我是李小墨,be foolish,be hungry。本篇文章主要写java线程状态转换,欢迎大家多多斧正,如果觉得小墨我写得用心的话,可以点个赞啊。 主要讲述java线程状态转换,参入使用少量代码
  • 二.java多线程线程状态转换   1、新建状态(New):新创建了一个线程对象。 2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可...
  • 目录1 线程状态2 转换过程 1 线程状态 2 转换过程 t.start():线程开始运行; obj.wait()/obj.notify():对象调用等待同步; t.join():线程调用线程加入; LockSupport.park()/LockSupport.unpark(t):锁同步方法...
  • 线程:是指进程中的一个执行流程。 线程与进程的区别:每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址...Java实现多线程的方法有两种,一是继承Thread类、二是实现R...
  • 多线程6种状态转换

    2020-10-20 22:31:23
    多线程状态转换图 二 状态转换 1 new 状态 还没调用start方法时候的状态 2 runnable 运行时状态 Java线程的RUNNABLE状态其实是包括了传统操作系统线程的ready和running两个状态的。 suspend()挂起,进入...
  • 线程:是指进程中的一个执行流程。 线程与进程的区别:每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址...Java实现多线程的方法有两种,一是继承Thread类、二是实现Runnabl...
  • 多线程线程状态转换 常见的函数 ① sleep():使线程静止,不会释放对象锁. ② wait():使线程释放对象锁,需与 synchronized() ,notify(). ③notify():唤醒处于 同步块 wait() 的一段线程使其运行. ①②...
  • 说明:线程共包括以下5种状态。1.新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。2.就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该...
  • 线程状态转换

    2018-03-05 22:09:53
    Java多线程线程状态转换以下内容整理自:http://blog.csdn.net/wtyvhreal/article/details/44176369线程:是指进程中的一个执行流程。 线程与进程的区别:每个进程都需要操作系统为其分配独立的内存地址空间,而...
  • 等待状态的定义:处于这种状态线程无限期地等待另一个线程执行特定操作。 阻塞状态的定义:一个线程因为等待临界区的锁被阻塞产生的状态。 我们可以看出二者的区别等待状态是主动的阻塞,阻塞状态是被动的阻塞。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,158
精华内容 863
关键字:

多线程状态转换