什么是线程 ? 什么是进程? java可以开启线程吗?不能 因为Java无法直接操硬件,他是运行在虚拟机上面的, 什么是并发? 什么是并行? 并发就是多个线程去操作一个资源。 并行是多个线程同时行,但是操作的资源不是同一个。 线程的六个状态 new (诞生) runnable (运行)Blocked(阻塞)waiiiing(等待) Tiem -waiing(超时等待) TERMINATED终止 wait 和seleep 区别 wait 来着objiet seleep 来自Thread wait会释放锁 seleep不会释放锁 wait 作用用同步代码块中 seleep 任何地方 wait 不需要捕获异常 seleep需要
Look (线程是一个单独的资源类) 传统锁 synchionized 本质——队列加锁 look是接口 接口有实现类 读锁 写锁 可重复锁 公平锁 ——先来后到 非公平锁 可以插队
look 三步 1 new look 2 加锁 3 解锁
Synchronied和look区别
1 S是关键字 look是类
2 S自动无法判断锁的状态
3 S会自动释放锁 ,Look锁必须手动释放 如果不手动释放 会造成死锁问题
4 S如果线程一阻塞了 线程二会死等,look锁不会等
5 S开重入锁 不可中断 非公平 :look 可重入 可以判断
生产者和消费者问题
有两个线程 如果一个线程完成对资源的操作 ,通知其他线程继续对资源的操作
如果是多线程 那么就会造成虚假唤醒 具体的业务代码用whlie 来判断
JUC里面再线程的唤醒里可以具体设置要换线哪一个线程 Condition 给每一个线程配置一个监听器
八锁现象
锁的是存在 锁的对象收 方法调用者
两个方法用的是谁先拿到谁先执行
普通S锁的是方法调用者
static 、锁的是该类的clas锁的是全局唯一
new 锁的this static 锁的的全局唯一
集合类不安全
list是线程不安全的 如何实现线程安全呢
1 创建vector(安全的)
2 工具类 所有集合都继承一个Connection Connection .Synchornized(new ArrayLIst<>());
3 new CopyoOnwriteArrayList<>();
CopyoOnwrite 写入时复制 COW优化策略
写入的时候复制一个数组 写完再插入
concurrentodifictioanEXcptioan 并发修改异常l
BlockingQueue 消息队列
Callable 1 可以有返回值 2 可以抛出异常 3 方法不同
CountDownluth -辅助工具类(计算器)
指定一定的线程跑完之后(计数器归零)再往下执行 常用于必须执行的线程的任务
队列是有大小的 再创建队列的时候必须指定队列的大小 队列和list是平级的实现Coonetion 我们创建的队列为普通队列 元素保持先进先出的原则 当队列里面的元素满了 再往里面添加元素会出现异常,从队列里面的拿元素,如果全部拿完也会出现异常 队列里面有四组API设置 这两种异常
第一种 add();//添加元素 remove();//移除或者取出元素 先进先出 会拿出第一个放入的元素
第一种会抛出异常
第二种 添加 offer 移除 poll //有异常不会抛出异常 会返回false 没有异常就发返回true。如果队列里面没有元素就会返回一个null; 第三种 put 添加 take 移除 // 阻塞 当队列里面的元素满了的时候 再添加一个元素的时候 会等 等到队列里面会空出来一个位置 吧这个元素添加进去 这时候从程序才算结束 take也是一样 这样写程序容易崩 第四种 再第三种上面添加了时间限制 如果超过时间限制 就结束等待 同步队列 SynchronousQueue BlockingQunene 没有容量 put take 必须 等待取出来之后 才能往里面添加一个元素即容量最大为一
线程池
好处降低资源消耗 提高响应速度 方便管理
三大方法
ExecutorService threadPool = Executors.newSingleThreadExecutor();// 单个线程
ExecutorService threadPool = Executors.newFixedThreadPool(5); // 创建一
个固定的线程池的大小
ExecutorService threadPool = Executors.newCachedThreadPool(); // 可伸缩
的,遇强则强,遇弱则弱
阿里开发手册中规定不要使用Java自带的线程池 要根据服务器性能和数据的处理效果来设计一个线程池