@zhuanxu
2017-12-13T13:33:30.000000Z
字数 1257
阅读 1687
并发编程
java
方式一:继承 Thread 类
方式二:实现 Runnable 接口
两者区别:继承 Thread 类创建线程的方法, 在继承了 Thread 类之后, 不能再继承其他的方法,这样灵活性就不如实现 Runnable 接口来创建线程的方法。
在我们创建线程的时候都会优先采用实现 Runnable 接口的方法。
我们调用Thread.stop()
的时候,会直接终止线程,并且会立即释放这个线程持有的锁,可能导致数据不一致,一个例子就是看下图:
根本原因就是因为调用stop即使在持有锁的情况下也直接退出,不等写操作完成。
中断相关的方法有:
当我们调用Thread.sleep()
的时候,会抛出InterruptedException
异常,我们处理逻辑如下:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("interrupted when sleep");
Thread.currentThread().interrupt();
}
当调用wait
的时候,会挂起到等待队列,当其他线程调用notify
的时候,随机唤醒一个等待的线程。
另外在调用wait,notify
之前,都需要去获取监视器。
获取监视器的一种方式就是通过synchronized
方法。
此处在wait的时候,如果阻塞会释放监视器,当被notify的时候,再尝试去获取监视器。
此处suspend的一个问题是,当在线程持有资源的状态下被挂载,资源并不会释放,会影响其他试图获取资源的线程。
我们在使用上,不应该调用原生的suspend和resume方法,而是通过简单封装wait和notify来实现。
join和yield方法,join是等待线程结束,其核心代码是:
while(isAlive()){
wait(0);
}
本质是调用wait等待,当被join的线程结束运行的时候会调用notifyall通知所所有等待的线程。
yield方法是主动让出cpu,重新进行一次调度。
通过ThreadGroup
我们可以为Thread
分门别类的进行管理。
关键字 synchronized 的用法: