[关闭]
@zhuanxu 2017-12-13T05:33:30.000000Z 字数 1257 阅读 595

java 并发编程基础

并发编程 java


线程的创建

方式一:继承 Thread 类
方式二:实现 Runnable 接口
两者区别:继承 Thread 类创建线程的方法, 在继承了 Thread 类之后, 不能再继承其他的方法,这样灵活性就不如实现 Runnable 接口来创建线程的方法。

在我们创建线程的时候都会优先采用实现 Runnable 接口的方法。

线程的终止

我们调用Thread.stop()的时候,会直接终止线程,并且会立即释放这个线程持有的锁,可能导致数据不一致,一个例子就是看下图:

根本原因就是因为调用stop即使在持有锁的情况下也直接退出,不等写操作完成。

线程中断

中断相关的方法有:

当我们调用Thread.sleep()的时候,会抛出InterruptedException异常,我们处理逻辑如下:

  1. try {
  2. Thread.sleep(1000);
  3. } catch (InterruptedException e) {
  4. System.out.println("interrupted when sleep");
  5. Thread.currentThread().interrupt();
  6. }

等待和通知


当调用wait的时候,会挂起到等待队列,当其他线程调用notify的时候,随机唤醒一个等待的线程。
另外在调用wait,notify之前,都需要去获取监视器。

获取监视器的一种方式就是通过synchronized方法。
此处在wait的时候,如果阻塞会释放监视器,当被notify的时候,再尝试去获取监视器。

挂起和继续执行


此处suspend的一个问题是,当在线程持有资源的状态下被挂载,资源并不会释放,会影响其他试图获取资源的线程。

我们在使用上,不应该调用原生的suspend和resume方法,而是通过简单封装wait和notify来实现。

等待线程结束和让出cpu

join和yield方法,join是等待线程结束,其核心代码是:

  1. while(isAlive()){
  2. wait(0);
  3. }

本质是调用wait等待,当被join的线程结束运行的时候会调用notifyall通知所所有等待的线程。

yield方法是主动让出cpu,重新进行一次调度。

线程组

通过ThreadGroup我们可以为Thread分门别类的进行管理。

synchronized 的原理

关键字 synchronized 的用法:

一些隐秘错误

  1. 容器(ArrayList)非线程安全,使用Vector
  2. 容器(HashMap)非线程安全,使用ConcurrentHashMap
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注