`

线程的方法

    博客分类:
  • Java
阅读更多

今天复习下线程

 

线程的方法:

 

1. sleep()

    让调用该方法的线程睡眠指定时间,sleep结束后,线程进入就绪状态,等待拿到CPU执行权后进入运行状态。

调用sleep()方法只是交出CPU执行权并不会让线程释放它所持有的同步锁,而且在这期间它也不会阻碍其它线程的运行。

    注意:

    线程醒来之后不会马上运行,而要等待cpu给其分配时间片。因此sleep()中指定的时间并不是线程不运行的精确时间!所以不能依赖sleep()方法提供十分精确的定时

 

 

2. wait()

    当调用了某个对象的wait()方法时,当前运行的线程就会转入WAITING状态,等待别的线程再次调用这个对象的notify()或者notifyAll()方法唤醒它,或者到了指定的最大等待时间,线程自动醒来。如果线程调用了某个对象的wait()方法,这个线程就会释放这个对象所持有的同步资源(不会释放其他对象的同步锁),并交出CPU执行权,进入对象的等待池。

 

 

 

3. join()

    join就是阻塞调用线程,直到该线程结束后,调用线程才能继续执行。该影响只存在于执行join方法的线程和调用该线程的线程之间。如在t1线程中调用t2.join(),则需要t2线程执行完后t1方能继续执行。

 

 

 

4. yield()

     让当前运行Thread放弃其所占用的cpu时间片,以便让其他Thread运行。用yield()方法的目的是让Thread能适当地轮转。但是,并不能保证达到此效果!因为,即使当前Thread放弃时间片,可是还有可能再次被JVM选中!也就是连任。

 

 

5. interrupt()

    interrupted方法是查询是否有“中断状态”这一标志,而这一标志很重要很重要。
    通常情况下这个标志都是没有被设置的,一旦这个标志被设置了,则所有当前正在阻塞的方法(限定在由于wait、sleep、join三种方法引发的阻塞)都会立刻完成“跳出阻塞状态、抛出InterruptedException异常、清除中断状态标志”这三件工作。仿佛线程在阻塞时,总在不断的查询这一标志,一旦发现这个标志被设置了,那么就立刻发生上述提到的三件工作。不过这只是一种猜测,至于底层到底是如何实现的,我们并不知道。

    而我们调用interrupt方法也很有趣,通常这个标志都是未被设置的,一旦调用这个方法,它就会设置这个标志,说白了,这个方法所完成的工作也就仅仅限于设置了一个这样的标志。接下来就能和上一段落中提到的事情相关联了,如果线程当前是阻塞的状态,那么它会利用这个标志啦,然后做“三件事情”,然后这个标志又被清除了;如果线程当前是非阻塞状态,那么该方法的调用也就仅仅是设置一个标志而已,注意设置了这个标记就和没设置这个标记完全不同了,一旦你再想调用sleep等阻塞方法时,它们都会“立刻跳出阻塞状态、抛出异常、清除标记”。

 

 

 

6. isInterrupted()

     判断进程是否被中断。

 

 

 

7. Interrupted():

    判断进程是否被中断,并唤醒进程(把进程的中断状态设为false)。

 

 

 

8. setDaemon(true)

    设置线程为监护线程。

 

 

 

9.  isDaemon()

    检测和判断某个线程是否为监护线程。

 

 

 

注:sleep 和 yield 方法的区别

    sleep 方法使当前运行中的线程睡眼一段时间,进入不可运行状态,这段时间的长短是由程序设定的,yield 方法使当前线程让出 CPU 占有权,但让出的时间是不可设定的。实际上,yield()方法对应了如下操作: 先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把 CPU  的占有权交给此线程,否则,继续运行原来的线程。所以yield()方法称为“退让”,它把运行机会让给了同等优先级的其他线程。

    另外,sleep 方法允许较低优先级的线程获得运行机会,但 yield()  方法执行时,当前线程仍处在可运行状态,所以,不可能让出较低优先级的线程些时获得 CPU 占有权。在一个运行系统中,如果较高优先级的线程没有调用 sleep 方法,又没有受到 I\O 阻塞,那么,较低优先级线程只能等待所有较高优先级的线程运行结束,才有机会运行。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics