多线程
多线程不是一个Cpu同时做多件事情,而是一个cpu只做一件事,创建多个cpu。
多线程与方法调用的区别:
方法间调用;普通方法调用,从哪里出发回到哪里,是一条闭合的路径。
而多线程使用是多条并行的路径。
程序(静态),进程(动态)与线程:
一个程序就是一个进程。进程是指在操作系统中运行的程序。一个进程包含多个线程。没有线程的进程也被看做“单线程”;
线程就是独立的运行路径。线程是CPU调度和执行的基本单位,而进程是操作系统资源分配 基本单位。线程也经常被称作是“轻权进程“轻量级进程””。
线程只会跟它的工作内存打交道,然后工作内存再与主内存打交道。
用户线程(User Thread):必须等待程序执行完才能停下。运行在前台;Java虚拟机会等待用户线程结束。
守护线程(Daemon Thread):为用户线程服务的。运行在后台;而Java虚拟机不会等待守护线程结束。
####### 创建线程
创建线程有3种方式:
1.继承Thread类,重写run方法,调用用start(),将进程交给CPU;
2.实现Runnable接口,重写run方法,没有继承Thred类,通过new
Thread创建一个thread对象,然后通过thread对象调用start方法。
3.实现Callable接口:它调用call方法;可以抛出异常,而且还可以返回值。
start也不是马上执行线程,而是将线程交给CPU,CPU调度什么时候用到了就什么时候执行。
优先级高的线程不代表一定会执行。只是分配的几率会大些。
代理模式
之前有提到过装饰模式和代理模式,现在主要了解一下代理模式。
代理模式分为静态代理和动态代理。
静态代理 的类是早就写好了的。而动态代理则是在程序运行过程中自动构建出来的。
####### lamda表达式
jdk8增加的新功能。主要是避免匿名内部类定义过多,其实质属于函数式编程的概念。主要是关注线程体。凡是有匿名内部类的地方的原因lambda就可以使用。
如果有参数和返回值,可以省略参数类型和小括号,若只有一行语句,则可以省略花括号。
线程状态
进入死亡状态的线程不能再次进入新生状态,不能重新开启,若是重新开启,则是一个新的线程。
进入阻塞状态的线程不能马上进入运行状态,而是进入就绪状态
// 可能有些错误,暂时只做了解,后面再深入
进入就绪状态的4种方法:
1.调用start()方法;
2.阻塞事件解除;
3.在运行状态中,调用yield()方法,主动让出CPU的调度,进入就绪状态
4.JVM本身将CPU从本地线程切换到其他线程,本地线程进入就绪状态。
运行状态一定是就绪状态受到了CPU的调度,才会进入运行状态。
进入阻塞状态的4种原因:
1.sleep()方法,抱着资源不给其他人用;
2.wait()方法;等待,不占用资源;
3.join,插队,要等待其他进程运行完才能运行;
4.有些调用操作系统的操作也会使进程进入阻塞状态,例如IO的read和write。
sleep抱着资源睡觉,当遇到slee时,程序从运行状态进入阻塞状态,然后再从阻塞状态进入就绪状态。
yield是从运行状态进入就绪状态。礼让线程。
sleep和yield都是静态方法,直接写在程序中。
join合并线程,将多条线程合并成一条线程,等待该线程执行完毕,才能执行其他线程。join是成员方法,必须通过thread对象来调用。join所在的线程体被阻塞。
在api中线程状态状态的描述
NEW --RUNNABLE–BLOCKED–WAITING–TIMED WAITTING–TERMINATED。
线程优先级和线程分类
priority优先级只代表一个概率,但不是绝对的。
用户线程(User Thread):必须等待程序执行完才能停下。运行在前台;Java虚拟机会等待用户线程结束。
守护线程(Daemon Thread):为用户线程服务的。运行在后台;而Java虚拟机不会等待守护线程结束。
线程同步
synchronized
线程同步是指在多个线程的情况下,要保证数据的一致性和准确性。同时还要提高性能。以上也被称为并发控制。保证了准确性则被称为线程安全。
并发:同一个对象被多个线程同时使用。
线程同步:一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池队列。还有加入了锁机制(synchronized),有同步方法和同步块。
加锁锁住的是相应对象的资源。
同步方法默认用this或者当前类class对象作为锁;
同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;
同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰;
Java中四类块
1 局部块 :在方法里面,主要是解决变量 的作用范围
2 构造块: 在类中,与属性一起的区域,主要是初始化对象信息
3 静态块:只加载一次,主要是初始化类的。
4 同步块,synchronized(obj),obj被称为同步监视器
线程协作
并发协作模型–生产者和消费者模式:
解决方式:管程法:生产者-缓冲区-消费者
信号灯法。
线程通信
线程通信中使用的一些方法。由Object类提供。但都只能在同步方法和同步块中使用,否则会抛出异常。