第一章 Java多线程技能

1.实现多线程的两种方式

继承Thread类与实现Runnable接口。

2.获取当前线程

Thread.currentThread获取对象后可以使用getName()方法获取线程名称以及getId()方法获取线程id等。

3.  一些基本API:isAlive(),sleep(),getId(),yield()等。

isAlive()测试线程是否处于活动状态

sleep()让“正在执行的线程”休眠

getId()取得线程唯一标识

yield()放弃当前的CPU资源

4.弃用的API

stop()停止当前线程。不会保证释放当前线程占有的资源。

该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。

如果安装了安全管理器,则以 this 作为其参数调用 checkAccess 方法。这可能引发 SecurityException(在当前线程中)。

如果该线程不同于当前线程(即当前线程试图终止除它本身以外的某一线程),则安全管理器的 checkPermission 方法(带有RuntimePermission("stopThread") 参数)也会被调用。这会再次抛出 SecurityException(在当前线程中)。

无论该线程在做些什么,它所代表的线程都被迫异常停止,并抛出一个新创建的 ThreadDeath 对象,作为异常。

停止一个尚未启动的线程是允许的。如果最后启动了该线程,它会立即终止。

应用程序通常不应试图捕获 ThreadDeath,除非它必须执行某些异常的清除操作(注意,抛出 ThreadDeath 将导致 try 语句的 finally 子句在线程正式终止前执行)。如果 catch 子句捕获了一个 ThreadDeath 对象,则重新抛出该对象很重要,因为这样该线程才会真正终止。

对其他未捕获的异常作出反应的顶级错误处理程序不会打印输出消息,或者另外通知应用程序未捕获到的异常是否为 ThreadDeath 的一个实例

suspend()使线程暂停,但是不会释放类似锁这样的资源。

该方法已经遭到反对,因为它具有固有的死锁倾向。如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前任何线程都不能访问该资源。如果重新开始目标线程的线程想在调用resume 之前锁定该监视器,则会发生死锁。这类死锁通常会证明自己是“冻结”的进程

resume()使线程恢复,如果之前没有使用suspend暂停线程,则不起作用。

详情查看http://blog.csdn.net/woaigaolaoshi/article/details/51298759

5. 线程的优先级:继承性,规则性,随机性

a.线程的优先级具有继承性. 如,线程A启动线程B,则B和A优先级一样

b.线程的优先级具有规则性. CPU尽量倾向于把资源优先级高的线程

c.线程的优先级具有随机性. 优先级不等同于执行顺序,二者关系不确定

6. java中的两种线程:用户线程和守护(Daemon)线程

守护线程:进程中不存在非守护线程时,守护线程自动销毁。典型例子如:垃圾回收线程。

7. 正确中断线程的方法


在使用break时,由于break只是跳出循环,所以循环之后的内容还是会执行。所以建议使用异常法。同时,用return也能起到中断效果。

8.辨析

a. interrupted()isInterrupted()

interrupted()是类的静态方法,测试当前线程是否已经是中断状态,执行后具有将状态标志清除为false的功能。

isInterrupted()是类的实例方法,测试Thread对象是否已经是中断状态,但不清楚状态标志。

b. sleep()和wait()区别:

  • sleep()是Thread类的static(静态)的方法;wait()方法是Object类里的方法
  • sleep()睡眠时,保持对象锁,仍然占有该锁;wait()睡眠时,释放对象锁
  • 在sleep()休眠时间期满后,该线程不一定会立即执行,这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级;wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程
  • wait()必须放在synchronized block中,否则会在runtime时扔出java.lang.IllegalMonitorStateException异常



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章