1.创建线程的三种方式:
1.1 继承Thread
1.2 实现Runnable接口
1.3 实现FutureTask<T> 包装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 队列满,或者队列空会阻塞线程
网友评论