企业应该找什么样的网站建设公司,网站如何做优化推广,wordpress字数统计m 去除图片等,升级wordpress 错误:连接服务器时出错_请检查设置.目录 一、为什么要有多线程#xff1f; 1、线程与进程 2、多线程的应用场景 3、小结 二、多线程中的两个概念#xff08;并发和并行#xff09; 1、并发 2、并行 3、小结 三、多线程的三种实现方式 1、继承Thread类的方式进行实现 2、实现Runnable接口的方式进行实现 3、利用… 目录 一、为什么要有多线程 1、线程与进程 2、多线程的应用场景 3、小结 二、多线程中的两个概念并发和并行 1、并发 2、并行 3、小结 三、多线程的三种实现方式 1、继承Thread类的方式进行实现 2、实现Runnable接口的方式进行实现 3、利用Callable接口和Future接口方式的实现 4、多线程三种实现方式对比 四、常见的成员方法 1、get/setName方法 -- 线程名字 2、currentThread方法 -- 获取当前线程对象 3、sleep方法 -- 线程休眠 4、set/getPriority方法 -- 线程优先级 5、setDaemon方法 -- 守护线程 6、yield方法 -- 礼让线程 7、join方法 -- 插入线程 8、线程的生命周期 五、线程安全的问题 1、练习设计一个程序模拟电影院卖票 2、买票引发的安全问题 ①、重复票的由来线程在执行代码的过程中CPU的执行权随时有可能被抢走 ②、出现了超出范围的票和上面的原因相同 3、安全问题的解决办法 -- 同步代码块 4、同步代码块中的两个小细节 ①、细节1synchronized要写在循环的里面 ②、细节2synchronized中的锁对象一定是唯一的 5、同步方法 6、StringBuilder和StringBuffer的区别 7、Lock锁手动加锁、释放锁 ①、Lock使用不规范造成的两个安全问题 六、死锁 七、生产者和消费者等待唤醒机制 1、消费者等待 2、生产者等待 3、常见方法wait/notify/notifyAll 4、消费者与生产者代码实现 ①、Cook.java ②、Desk.java ③、Foodie.java ④、ThreadDemo.java 5、阻塞队列方式另一种等待唤醒机制 ①、阻塞队列的继承结构 ②、阻塞队列实现等待唤醒机制 7、多线程的6中状态 八、综合练习 1、多线程练习1卖电影票 2、多线程练习2送礼品 3、多线程练习3打印奇数数字 4、多线程练习4抢红包 精确运算BigDecimal 5、多线程练习5抽奖箱抽奖 6、多线程练习6多线程统计并求最大值 7、多线程练习7多线程之间的比较 8、多线程练习8多线程阶段大作业 九、线程池 1、吃饭买碗的故事 ①、问题 ②、解决方案 2、以前写多线程的弊端 3、线程池的核心原理 4、线程池的代码实现 ①、Executors工具类 ②、线程复用示例 ③、创建一个有上限的线程池 5、自定义线程池ThreadPoolExecutor ①、任务拒绝策略 ②、代码实现 ③、小结 6、最大并行数 ①、什么是最大并行数 ②、向Java虚拟机返回可用处理器的数目 7、线程池多大才合适 十、多线程的额外扩展内容 一、为什么要有多线程 1、线程与进程 举例在任务管理器中一个软件运行之后它就是一个进程 线程简单理解线程就说应用软件中互相独立可以同时运行的功能 单线程程序所有的都在一个线程中执行耗时长 2、多线程的应用场景 3、小结 二、多线程中的两个概念并发和并行 1、并发 2、并行 以2核4线程为例如果计算机中只要4条线程那么它是不用切换的但如果线程越来越多那么这个红线就会在多个线程之间随机的进行切换 3、小结 三、多线程的三种实现方式 1、继承Thread类的方式进行实现 代码实现 ①、自己定义一个类继承Thread并重写run方法 ②、创建子类的对象并启动线程 2、实现Runnable接口的方式进行实现 代码实现 ①、自己定义一个类实现Runnable接口并重新里面的run方法 ②、创建自己的类对象 ③、创建一个Thread类的对象并开启线程 示例代码 3、利用Callable接口和Future接口方式的实现 代码实现 ①、创建一个类MyCallable实现Callable接口并重写call ②、创建MyCallable/FutureTask/Thread的对象 完整代码 4、多线程三种实现方式对比 四、常见的成员方法 1、get/setName方法 -- 线程名字 默认名字的由来 序号自增 细节 2、currentThread方法 -- 获取当前线程对象 3、sleep方法 -- 线程休眠 4、set/getPriority方法 -- 线程优先级 抢占式调度随机性 非抢占式调度轮流 没有设置优先级则默认为5优先级越高抢到CPU的概率就越高 示例代码 5、setDaemon方法 -- 守护线程 两个线程执行的代码不同守护线程是陆续结束的所以守护线程也叫做备胎线程 守护线程的应用场景 6、yield方法 -- 礼让线程 但只是尽可能的均匀不是绝对的 7、join方法 -- 插入线程 插入线程将土豆插入到main线程之前只有当土豆线程执行完毕才会轮到main线程 8、线程的生命周期 五、线程安全的问题 1、练习设计一个程序模拟电影院卖票 示例代码 出现了超出票范围或者重复票的情况 2、买票引发的安全问题 ①、重复票的由来线程在执行代码的过程中CPU的执行权随时有可能被抢走 ②、出现了超出范围的票和上面的原因相同 3、安全问题的解决办法 -- 同步代码块 示例代码锁对象一定得是唯一的 4、同步代码块中的两个小细节 ①、细节1synchronized要写在循环的里面 ②、细节2synchronized中的锁对象一定是唯一的 示例代码当前类的字节码文件对象 5、同步方法 示例代码 将同步代码块改成同步方法 6、StringBuilder和StringBuffer的区别 两个类的方法都是相同的 但是StringBuffer是线程安全的它里面所有的方法都是线程同步的 StringBuilder是非线程安全的所以如果用到多线程则可以使用StringBuffer没有需求则选择StringBuilder 7、Lock锁手动加锁、释放锁 ①、Lock使用不规范造成的两个安全问题 Ⅰ、重复票以及超出范围票 我们在使用Thread类实现多线程时创建自己的类一定要注意锁对象需要唯一即在相关变量前加上static关键字 Ⅱ、程序无法正常终止 这是由于当满足条件时循环直接被终止导致lock锁没有被释放 Ⅲ、正确代码标准写法 即将容易产生异常的代码块放入try…catch中 六、死锁 死锁是指两个或两个以上的进程在执行过程中由于竞争资源或者由于彼此通信而造成的一种阻塞的现象若无外力作用它们都将无法推进下去。 代码实现理解过程 注意事项千万不要让两个锁嵌套起来 七、生产者和消费者等待唤醒机制 生产者消费者模式是一个十分经典的多线程协作的模式 1、消费者等待 2、生产者等待 3、常见方法wait/notify/notifyAll 4、消费者与生产者代码实现 ①、Cook.java ②、Desk.java ③、Foodie.java ④、ThreadDemo.java 5、阻塞队列方式另一种等待唤醒机制 ①、阻塞队列的继承结构 ②、阻塞队列实现等待唤醒机制 Cook.java put方法的源码中实现了Lock锁 Foodie.java take方法的底层也是有锁的 ThreadDemo.java 打印语句是在锁的外面的但是不会对数据造成影响只是影响了控制台的打印阅读体验 7、多线程的6中状态 Java中是没有定义运行状态的只有以下6种状态这是因为一旦线程抢夺到CPU执行权之后线程就会交给操作系统了Java就不管了 八、综合练习 1、多线程练习1卖电影票 待补充~ 2、多线程练习2送礼品 待补充~ 3、多线程练习3打印奇数数字 待补充~ 4、多线程练习4抢红包 示例代码 测试类 精确运算BigDecimal 5、多线程练习5抽奖箱抽奖 示例代码 MyThread.java 测试类 6、多线程练习6多线程统计并求最大值 示例代码一在练习5的基础上进行修改 MyThread.java 示例代码二升级版--线程栈示例一可以用但不好 改进后这里只需要一个ArrayList就搞定了 示例二内存图讲解 每个线程都有自己独立的空间 7、多线程练习7多线程之间的比较 示例代码难点在于如何获取两个线程中的最大值★ 调用多线程的第三种方式Callable来实现可以返回结果 MyCallable.java 测试类 8、多线程练习8多线程阶段大作业 待补充~ 九、线程池 1、吃饭买碗的故事 ①、问题 ②、解决方案 买个碗柜买了碗之后不摔存入碗柜中 2、以前写多线程的弊端 3、线程池的核心原理 当有新的任务出现且线程池线程不足时会新建线程以满足需求其中最大线程的数量可以自行设置 4、线程池的代码实现 ①、Executors工具类 示例代码 MyRunnable.java 测试类 ②、线程复用示例 测试类 ③、创建一个有上限的线程池 测试类 5、自定义线程池ThreadPoolExecutor ①、任务拒绝策略 以下面示例为例它会将任务4抛弃将任务10加入 ②、代码实现 ③、小结 6、最大并行数 ①、什么是最大并行数 ②、向Java虚拟机返回可用处理器的数目 7、线程池多大才合适 可以通过thread dump来计算CPU的计算时间和等待时间 十、多线程的额外扩展内容 准备面试时可以再突击学习资料可见《多线程额外扩展.md》