2021-01-05-线程

1.创建线程的三种方式:

1.1 继承Thread

1.2 实现Runnable接口

1.3 实现FutureTask 包装Callable接口 (区别于run执行方法,call可带返回值)

优缺点:

继承Thread类方式优点就是获取当前线程比较方便 缺点就是不能继承其他类

实现runnable 或者 callable  可以多个线程共享同一个target,并且可以继承其他类

2.线程的生命周期

2.1 新建:实例化线程类,线程就处于新建状态,此时分配内存并初始化。

2.2 就绪: 调用线程的start方法后,此时线程处于就绪状态,虚拟机创建方法调用栈和程序计数器。此时线程也并没有运行,是否运行取决于线程调度器的调度

2.3 运行:获得cpu资源,并执行线程执行体run方法。

2.4 阻塞:

抢占式策略:以线程可占时间段来暂用cpu资源,不断轮切线程进行执行。

协作式策略: 只有当主动调用线程的sleep或yield方法 才会放弃占用的资源。

被阻塞几种情况:

1.sleep等方法的调用,主动放弃资源,此时线程进入阻塞状态

2.调用了阻塞式的IO方法

3.同步监听器被其他线程所持有。 这个也是线程安全的集合为什么性能会差于线程不安全的

4.等待notify

5.调用suspend挂起。

2.5:死亡

3.sleep和yield区别 

都是让当前线程执行。不同点:sleep 阻塞线程,yield 暂停线程重置为就绪状态。

yield调用后,cpu很可能再暂停后立马又运行该线程。由当前就绪状态的线程数和优先级来决定。

4.同步监视器

多线程下,对可变类进行修改容易引起数据不安全,所以通过同步监视器进行同步工作,也就是线程安全。两种方式。

1.在执行修改共享数据得方法体内 用synchronized关键字包裹,并且锁对象是可变类得对象,

2.用synchronized关键字修饰可变类得方法。当前锁定得对象也是调用方法得对象。

5.线程通信三种方式

5.1 传统通信方式: synchronized 同步代码块和方法 + wait+notify +notifyAll

5.2 Condition控制:Lock 实例得Condition实例 +condition.await + condition.signal +condition.signalAll

5.3 BlockingQueue 阻塞队列:put 和 take 队列满,或者队列空会阻塞线程

你可能感兴趣的:(2021-01-05-线程)