首页 > 编程语言 > 详细

java线程小知识

时间:2015-11-17 21:56:34      阅读:242      评论:0      收藏:0      [点我收藏+]

1,

     synchronized,wait,notify,nofifyAll其实都是对锁的操作。synchronized一个对象,一个代码区,一个方法,其实都是获取该对象的锁,一个对象只有为一个的一个锁,代码区,和方法锁,其实获取的是该对象的锁。如

   public synchronized void test()

  {

  }

  执行该方法之前申请该对象的锁。

 

 2,Thread和Runable 

  thread 和 Runnable 的相同点:都是“多线程的实现方式”。

  Thread 和 Runnable 的不同点:

  Thread 是类,而Runnable是接口;Thread本身是实现了Runnable接口的类。我们知道“一个类只能有一个父类,但是却能实现多个接口”,因此Runnable具有更好的扩展性。

 

3,synchronized基本规则

  第一条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的该“synchronized方法”或者“synchronized代码块”的访问将被阻塞。

  第二条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程仍然可以访问“该对象”的非同步代码块。

  第三条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的其他的“synchronized方法”或者“synchronized代码块”的访问将被阻塞。

 

4,notify,notifyAll

  使用notify或notifyAll后,只是唤醒了其它该锁的wait线程,使他们拥有获取锁的权利,此时他们还是阻塞的,必须等待获取锁才能回到运行状态

 

5,interrupt

  该调用该操作时,首先会检查权限,没有会抛异常,如果有,做的操作是将线程的中断标记设置为True,并不会中断线程。如果该线程处于阻塞状态,则会抛出异常

  记住该操作知识做标记,并不会中断线程

  

下面是jdk描述

  本线程中断自己是被允许的;其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限。这有可能抛出SecurityException异常。如果本线程是处于阻塞状态:调用线程的wait(), wait(long)或

wait(long, int)会让它进入等待(阻塞)状态,或者调用线程的join(), join(long), join(long, int), sleep(long), sleep(long, int)也会让它进入阻塞状态。若线程在阻塞状态时,调用了它的interrupt()方法,那么它

的“中断状态”会被清除并且会收到一个InterruptedException异常。例如,线程通过wait()进入阻塞状态,此时通过interrupt()中断该线程调用interrupt()会立即将线程的中断标记设为“true”,但是由于线程处于阻

塞状态,所以该“中断标记”会立即被清除为“false”,同时,会产生一个InterruptedException的异常如果线程被阻塞在一个Selector选择器中,那么通过interrupt()中断它时;线程的中断标记会被设置为true,并且

它会立即从选择操作中返回。如果不属于前面所说的情况,那么通过interrupt()中断线程时,它的中断标记会被设置为“true”。中断一个“已终止的线程”不会产生任何操作。

 

6,java.lang.IllegalMonitorStateException分析

   1,当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;

        2,当前线程不含有当前对象的锁资源的时候,调用obj.notify()方法。

        3,当前线程不含有当前对象的锁资源的时候,调用obj.notifyAll()方法

java线程小知识

原文:http://www.cnblogs.com/2015zzh/p/4972966.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!