精华内容
下载资源
问答
  • 线程阻塞

    2015-10-22 15:49:00
    所谓的阻塞,就是线程能够运行,但是某个条件阻止它的运行,当线程处于阻塞状态时,调度器将忽略线程,不会分配给线程任何CPU时间,直到线程重新进入就绪状态,它才有可能执行操作。 为什么任务会进入阻塞的状态,...

    所谓的阻塞,就是线程能够运行,但是某个条件阻止它的运行,当线程处于阻塞状态时,调度器将忽略线程,不会分配给线程任何CPU时间,直到线程重新进入就绪状态,它才有可能执行操作。

    为什么任务会进入阻塞的状态,一般有以下几个原因:
    1.通过调用sleep(milliseconds)使任务进入休眠状态,在这种情况下,任务在指定的时间内不会运行;
    2.通过调用wait()使线程挂起,直到线程得到了notify()或notifyAll()消息(或者java SE5的java.util.concurrent类库中等价的signal()或signalAll()),线程才会进入就绪状态;

        在.NET中的实现诸如 lock(){monitor.wait()}; autoResetEvent.waitone() ;
    3.任务在等到某个输入或输出完成;

       apm 异步模型编程中,xx.accept(),阻塞在那边等待异步IO的返回结果。

    4.任务试图在某个对象上调用其同步控制方法,但是对象锁不可用,因为另一个任务已经获取这个锁;

    线程处于等待(阻塞)状态的场景

    参考:http://blog.sina.com.cn/s/blog_6af29f290100s3y9.html

    1.处于对象等待池中的阻塞状态,在对象上调用wait或者等待某个对象的同步锁。

    2.当前线程自己sleep了,

       或者调用了其他线程的join方法,

       或者发出了一个IO请求,例如system.out.println或者read ,

       或者调用线程让步方法yield。

     

    当前线程静态方法:

    1.sleep:阻塞当前线程一段时间,主动行为,不会分配到CPU资源,不会释放锁。

    2.yield:阻塞当前线程一段时间,主动行为,不会分配到CPU资源,不会释放锁。(跟sleep不同的是让出cpu资源,其他高优先级或者低优先级的线程得到执行)

    当前线程实例方法:

    1.join:阻塞调用线程,让调用线程等待在那边。线程实例阻塞调用线程,直到线程执行结束。

    2.wait:阻塞当前线程一段时间,释放锁资源,并且等待信号通知。(在.NET中实现诸如  lock(){monitor.wait()} ; autoResetEvent.waitone() )

     

    转载于:https://www.cnblogs.com/wuMing-dj/p/4901280.html

    展开全文
  • 线程阻塞

    2012-08-28 17:22:00
    所谓的阻塞,就是线程能够运行,但是某个条件阻止它的运行,当线程处于阻塞状态时,调度器将忽略线程,不会分配给线程任何CPU时间,直到线程重新进入就绪状态,它才有可能执行操作。就绪并代表是在运行啊,所谓的...

         

     所谓的阻塞,就是线程能够运行,但是某个条件阻止它的运行,当线程处于阻塞状态时,调度器将忽略线程,不会分配给线程任何CPU时间,直到线程重新进入就绪状态,它才有可能执行操作。就绪并代表是在运行啊,所谓的就绪,就是可运行也可不运行,只要调度器分配时间片给线程,线程就可以运行,因为我们都知道,调度器是如何分配线程,是不确定的。为什么任务会进入阻塞的状态,一般有以下几个原因:
            1.通过调用sleep(milliseconds)使任务进入休眠状态,在这种情况下,任务在指定的时间内不会运行;
            2.通过调用wait()使线程挂起,直到线程得到了notify()或notifyAll()消息(或者java SE5的java.util.concurrent类库中等价的signal()或signalAll()),线程才会进入就绪状态;
            3.任务在等到某个输入或输出完成;
            4.任务试图在某个对象上调用其同步控制方法,但是对象锁不可用,因为另一个任务已经获取这个锁;
            阻塞的任务是必须终止的,我们不能等待其到达代码中可以检查其状态值的某一点,因而决定让它主动终止,那么就必须强制这个任务跳出阻塞状态。那么怎样使任务跳出阻塞状态?就是中断。中断?没错,就是中断,但是中断是会抛出异常的啊!没问题,只要不抛出就行!Thread.interrupted()提供了离开run()而不抛出异常的方式。为了调用interrupt(),我们就必须持有Thread对象,但是现在java的concurrent类库在避免对Thread对象的直接操作,尽量通过Executor来执行所有操作。如果我们在Executor上调用shutdownNow(),那么它 将发送一个interrupt()调用给它启动的所有线程。为什么呢?因为当我们完成工程中的某个部分或者整个程序时,通常会希望同时关闭某个特定Executor的所有任务。但是我们也想要只中断某个单一的任务,于是就通过调用submit()而不是executor()来启动任务,就可以持有任务的上下文。submit()将返回一个Future<?>,其中有一个未修饰的参数。为什么要用这个泛型的<?>?其实我也对这个感到兴趣,但是一时半会还是理解不了,所以先放一边吧。持有这种Future的关键在于可以在其上调用cancel(),因此可以使用它来中断某个特定的任务,如果我们将true传递给cancel(),那么就会拥有在该线程上调用interrupt()以停止这个线程的权限。所以,cancel()是一种中断由Executor启动的单个线程的方式。如:
           Future<?> f = exec.submit(RunnableClass);
           f.cancel(true);
           但是我们要注意,不是所有阻塞都可以被中断的,第一种情况可以被中断,但是第3和第4种是不可以被中断的,至于第2种有待研究。
           第3种的解决方案就是利用各种nio类来使阻塞的nio通道自动响应中断。对于第4种,使用显示的ReentrantLock对象,因为在它上面阻塞的任务是具备可以被中断的能力,这与在synchronized方法或临界区上阻塞的任务完全不同。这时我们可以直接调用interrupt()来中断被阻塞的任务,如:lock.interrupt();
           当我们在线程上调用interrupt()时,中断发生的唯一时刻是在任务要进入到阻塞操作中,或者已经在阻塞操作内部时,但是如果根据程序运行的环境,我们可能已经编写了可能会产生这种阻塞调用的代码,那么该怎么办?如果我们只能通过调用在阻塞调用上抛出异常来退出,那么我们就无法总是可以离开run()循环。因此如果调用interrupt()已停止某个任务,那么在run()循环碰巧没有产生任何阻塞调用的情况下,我们的任务就需要第二种方式来退出。于是我们就需要利用中断状态。中断状态是可以通过调用interrupted()来检查中断状态,这不仅可以告诉我们interrupt()是否被调用过,而且还可以清除中断状态。清除中断状态可以确保并发结构不会就某个任务被中断这个问题通知我们两次,我们可以经由单一的InterruptedException或单一的成功的Thread.interrupted()测试来得到这种通知。如果想要再次检查以了解是否被中断,则可以在调用Thread.interrupted()时将结果存储起来。接下来就是展示检查的惯用法,应该在run()方法中使用它来处理在中断状态被设置时,被阻塞和不被阻塞的各种可能,如:
          public void run(){
               try{
                    while(!Thread.interrupted()){
                             ....
                             try{
                                  //被阻塞的可能
                                  try{
                                       //不被阻塞的可能
                                  }finally{ ...cleanup();}
                             }finally{.....cleanup();}
                      }
                 }catch(InterruptedException e){}
          }
    这里的惯用法特别强调,在我们经由异常离开循环时,必须要正确的清理资源。被设计用来响应interrupt()的类必须建立一种策略,来确保它将保持一致的状态,这通常意味着所有需要清理的对象创建的操作的后面,都必须紧跟try-finally子句,从而使得无论run()循环如何退出,清理都会发生。

    转载于:https://www.cnblogs.com/wenjiang/archive/2012/08/28/2660549.html

    展开全文
  • 关于线程阻塞的问题

    2016-05-20 16:36:36
    线程的阻塞状态:就是线程能够运行,但是某个条件阻止它的运行,当线程处于阻塞状态时,调度器将忽略线程,不会分配给线程任何CPU处理时间,直到线程重新进入就绪状态,它才有可能执行操作。 1.sleep方法可能导致...

    线程的阻塞状态:就是线程能够运行,但是某个条件阻止它的运行,当线程处于阻塞状态时,调度器将忽略线程,不会分配给线程任何CPU处理时间,直到线程重新进入就绪状态,它才有可能执行操作。
    1.sleep方法可能导致阻塞
    2.suspend导致阻塞状态,用resume恢复。
    3.yield自动放弃CPU使用时间,让出CPU时间给其他线程,可自动恢复。
    4.wait和notify,wait进入阻塞,不占用CPU时间,notify恢复。

    isalive
    getpriority
    setpriority
    sleep
    join(合并线程)
    join就是加入线程计划,一个一个来,当前线程执行完了,再执行,串联线程

    展开全文
  • 当一个线程处于新建状态时,程序中的代码还没有开始运行。 就绪状态: 一个新建的线程并不能自动运行,要执行线程必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行...

    新建状态:

    当使用new创建一个线程时,线程还没有开始运行,此时线程处于新建状态。当一个线程处于新建状态时,程序中的代码还没有开始运行。 

    就绪状态:

    一个新建的线程并不能自动运行,要执行线程必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。因为在单CPU的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由Java运行时系统的线程调度程序(thread scheduler)来调度的。

    运行状态:

    当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法。

    阻塞状态:

    1>线程通过调用sleep方法进入睡眠状态;
    2>线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
    3>线程试图得到一个锁,而该锁正被其他线程持有;
    4>线程在等待某个触发条件;

    死亡状态:

    有两个原因会导致线程死亡:
    1> run方法正常退出而自然死亡,
    2> 一个未捕获的异常终止了run方法而使线程猝死。


    注意:

    1、为了确定线程在当前是否存活着(可运行、被阻塞),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true; 如果线程仍旧是new状态且不是可运行的, 或者线程死亡了,则返回false。

    2、join()获取线程执行权

    3、yield()大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。

    展开全文
  • 进程 进程是指运行中的程序 线程的声明周期中所处的状态 新建状态: 用new语句创建的线程对象处于新建状态 就绪状态: 当一个线程对象创建后,其他线程调用它的start()方法,...当线程处于阻塞状态时,java虚拟机不会...
  • 线程状态:   线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。... 一个线程处于新生状态时,程序还没有开始运行线程中的代码2.就绪状态(R...
  • 如何结束阻塞状态线程

    千次阅读 2011-05-31 07:52:00
    比如一个线程由于需要等候键盘输入而被阻塞处于不可运行状态时,即使主程序中将该线程的共享变量设置为true,但该线程此时根本无法检查循环标志,当然也就无法立即中断。 其实,这种情况经常会发生,比如...
  • 一、线程的四种状态 新建(new):处于该状态的时间很短暂。已被分配了必须的系统资源,并执行了初始化。表示有资格获得CPU时间。调度器可以把该线程变为runnable或者blocked状态 ...当线程处于阻塞状态时,...
  • 一个线程处于新建状态时,它仅仅是一个空的线程对象,系统不为它分配资源。 Thread t = new Thread(new Runner()); 2.就绪(Runnable) 程序通过线程对象调用启动方法start()后,系统会为这个...
  • 文章目录实例描述实现过程代码...当线程需要获得对象的内置锁,而该锁正被其他线程拥有线程处于阻塞状态当线程等待其他线程通知调度表可以运行,该线程处于等待状态;当run()方法运行完毕或出现异常,线...
  • 3、阻塞:当线程处于阻塞状态时,调度时间不会分配给这个线程 4、死亡:不再可调度 二、在以下几种状况,线程会阻塞: 1、掉用sleep进入休眠(SleepBlock,可中断) 2、调用wait使线程
  • 1、新建状态当线程被创建,它短暂的处于这种状态。此时他已经分配了必要的资源并进行了初始化。 2、就绪状态:在这种状态下,只要调度器把时间 片分给线程,线程就可以运行。 3、运行状态:在这种状态下,线程...
  • 1.睡眠状态一个线程执行代码的时候调用了sleep方法后,线程处于睡眠状态,需要设置一个睡眠时间,此时有其他线程需要执行就会造成线程阻塞,而且sleep方法被调用之后,线程不会释放锁对象,也就是说锁还在该...
  • 查看线程的运行状态

    2019-07-04 11:19:00
    当线程需要获得对象的内置锁,而该锁正被别的线程拥有线程处于阻塞状态当线程等待其他线程通知调度表可以运行,该线程处于等待状态。对于一些含有时间参数的方法,如thread的sleep()方法,可以...
  • 新建状态:用new语句创建的线程对象处于新建状态。就绪状态:当一个线程对象创建后,其他线程调用它的start()...当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才有机会转到运...
  • java多线程线程状态

    2016-08-21 19:40:14
    线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。... 一个线程处于新生状态时,程序还没有开始运行线程中的代码  2.就绪状态(Runnable)  
  • Java线程线程状态

    2017-08-04 14:47:17
    线程可以创建6状态: New()新创建、Runnable(可运行)、Blocked(被阻塞)、 Waiting(等待)、Timed waiting(计时等待)、...一个线程处于状态时,程序还没开始执行线程中的代码。在线程运行之前还有一些基础工
  • 当线程启动以后,CPU需要在多个线程之间切换,所以线程也会随之在运行、阻塞、就绪这几种状态之间切换。线程的状态转换如图:当使用new关键字创建一个线程对象后,该线程就处于新建状态。此时的线程就是...
  • 线程的运行状态

    2018-10-21 19:38:00
    多线程的运行状态 多线程运行状态 线程从创建、运行到结束总是处于下面五个状态之... 一个线程处于新生状态时,程序还没有开始运行线程中的代码 就绪状态 一个新创建的线程并不自动开始运行,要执行线程,...
  • 先观察下面这张图 线程从创建、运行到结束总是处于下面... 一个线程处于新生状态时,程序还没有开始运行线程中的代码 就绪状态 一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。...
  • 清楚的理解和认知线程状态是java多线程的基础,多线程本质上其实就是管理多个线程的状态,以期在保证...4.java线程发生IO阻塞时 线程处于什么状态: 5.java线程和操作系统线程状态是如何对应的: java线程状态: ...
  • 一、线程各个状态与转换:新建状态:用...处于这个状态的线程位于可运行池中,等待获得CPU的使用权运行状态:处于这个状态的线程占用CPU,执行程序的代码阻塞状态:当线程处于阻塞状态时,java虚拟机不会给线程分配C...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 981
精华内容 392
关键字:

当线程处于阻塞状态时