摘要: 相当于sleep( 5000 ) , 效果一样; 阅读全文
posted @ 2019-04-07 20:45 wmqiang 阅读(481) 评论(0) 推荐(0) 编辑
摘要: 其中,多个线程必须使用的是同一个锁对象; 等待 wait 和唤醒 notify 的也就是这个对象监视器及锁对象的正在等待的单个线程,若多个,谁等的时间长唤醒谁; 代码实现: 从顾客消费者来买包子开始: 使用的是线程类Thread类的匿名内部类的匿名对象方式创建线程; 同步代码块的方式实现线程同步即解 阅读全文
posted @ 2019-04-07 20:38 wmqiang 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 线程状态概述: TIMED_WAITING: BLOCKED: 以下是重点: WAITING: 等待唤醒机制即线程通信:Object.wait() 和 Object.notify 阅读全文
posted @ 2019-04-07 20:18 wmqiang 阅读(158) 评论(0) 推荐(0) 编辑
摘要: 线程间通信——等待唤醒机制,避免争夺同一资源; 锁对象可以是任意Object类的子类对象; 包子案例: 包子案例——生产者和消费者: 代码实现: 关键就是在于两个线程使用同一个锁对象! 这边是主程序调用这两个线程时候传入的同一个对象! 包子铺线程类——生产者: 其中,baozi类作为成员变量,并且重 阅读全文
posted @ 2019-04-07 20:13 wmqiang 阅读(335) 评论(0) 推荐(0) 编辑
摘要: 线程同步即解决线程安全问题的第三种方式——使用lock锁 代码实现: 其中,ReentrantLock是lock接口的实现类,这边是使用多态创建,访问成员方法时,编译看左,运行看右; ReentrantLock对象要在方法体外面即成员位置就创建; 优化代码,将释放锁写道try/catch的final 阅读全文
posted @ 2019-04-07 17:41 wmqiang 阅读(248) 评论(0) 推荐(0) 编辑
摘要: 第二种线程同步的方式:同步方法; 代码实现: run方法中调用这个同步方法: 继续回到主程序创建多线程运行,结果是线程安全的; 转换为同步锁即转换成同步代码块写法: 是一样的效果; 再主程序中打印的创建的Runnable接口的实现类RunnableImpl对象地址值和 和创建的多线程中run方法中打 阅读全文
posted @ 2019-04-07 17:01 wmqiang 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 线程同步——解决线程安全问题 第一种方式,同步代码块; 代码实现: 其中,锁对象可以是任意对象,用Object对象是必然ok的,用synchronized关键字, synchronized( 锁对象 ){ 访问共享数据的代码块 } 再运行多线程的主程序: 还是原来的主程序,运行结果: 解决了线程安全 阅读全文
posted @ 2019-04-07 15:35 wmqiang 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 多线程访问共享数据,产生安全问题; 如卖票案列: 线程安全的代码表现: 其中,Thread类的静态方法sleep需要处理异常,throw抛出异常或者try/catch处理异常; while( true )即为死循环; 主程序执行: 其中,父类Thread构造方法入参为同一个Runnable的实现类R 阅读全文
posted @ 2019-04-07 15:18 wmqiang 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 创建多线程的第一种方式——创建Thread子类和重写run方法; 第二种方式——实现Runnable接口,实现类传参给父类Thread类构造方法创建线程; 第一种方式创建Thread子类和重写run方法: 创建线程: 主线程调用新线程,创建多线程: 运行结果是cpu随机执行; 阅读全文
posted @ 2019-04-07 14:59 wmqiang 阅读(1227) 评论(0) 推荐(0) 编辑
摘要: 定义一个普通的类: 引用这个类,执行main方法,main方法就是一个主线程: 线程:进程的执行单元,可以理解为栈内存中的所执行的方法(除了main方法之外都是线程中的run方法)地址开辟通往cpu的一条执行路径; 运行结果: 其中,0作为分母报算术异常; 阅读全文
posted @ 2019-04-07 14:45 wmqiang 阅读(1645) 评论(0) 推荐(0) 编辑
摘要: 进程:内存中运行的应用程序 其中,电脑内存是临时存储,关机就清除了; 线程:进程中的每个执行单元 一个程序运行后至少有一个进程,一个进程可以包含多个线程; 线程的调度: 阅读全文
posted @ 2019-04-07 13:06 wmqiang 阅读(559) 评论(0) 推荐(0) 编辑
摘要: 字不重要,看图。 阅读全文
posted @ 2019-04-07 12:39 wmqiang 阅读(300) 评论(0) 推荐(0) 编辑
摘要: 匿名内部实现多线程的两种方式创建: 使用匿名内部类用第一种方式即继承Thread类重写run方法: 运行结果: 使用匿名内部类用第二种方式即实现Runnable接口调用父类Thread的构造方法开启线程: 其中,new Thread(r).start使用的是匿名对象的方式直接调用start方法开启线 阅读全文
posted @ 2019-04-07 12:34 wmqiang 阅读(977) 评论(0) 推荐(0) 编辑
摘要: 实现Runnable接口创建多线程: 创建一个Runnable接口的实现类RunnableImpl: 主线程中: 其中,链式编程的Thread类的静态方法currentThread方法点getName是获取的是当前线程的名称; 运行结果: 线程抢占cpu资源是随机的,无法人为控制; 实现Runnab 阅读全文
posted @ 2019-04-07 11:59 wmqiang 阅读(1289) 评论(0) 推荐(0) 编辑
摘要: Thread类常用方法 获取当前线程名称的方法: 第一种方法,在线程中使用getName()方法: 执行结果: 其中,根据多线程的内存原理,会开辟包含主线程的四个栈空间出来供cpu四个线程执行,优先级cpu自己选择,认为控制不了,所以可能会先执行Thread-2线程,后执行的Thread-1线程; 阅读全文
posted @ 2019-04-07 11:07 wmqiang 阅读(2006) 评论(0) 推荐(0) 编辑
摘要: main线程即主线程,和调用的两外一个线程(继承Thread类重写run方法实现的一个线程): 程序原理解析: 内存原理解析: 阅读全文
posted @ 2019-04-07 10:25 wmqiang 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 斗地主案例——双列集合,看牌时候有序集合 需求分析设计: 代码实现: 封装一个看牌的方法: 主程序看牌步骤: 运行结果: 阅读全文
posted @ 2019-04-07 10:18 wmqiang 阅读(310) 评论(0) 推荐(0) 编辑
摘要: 只适用于List接口和Set接口和Map接口,不能改变,不允许有重复元素; 阅读全文
posted @ 2019-04-07 01:00 wmqiang 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 其中,字符的包装类是Character;字符串包装类是String; 遍历字符串转换的数组,每个元素都是一个字符,看创建的这个集合有木有,一开始肯定是没有的其实,字符作为key,所以判断的是这个创建的集合中key中有没有这个字符,出现次数作为value,有则++,再重新对这个key的键值对组成的元素 阅读全文
posted @ 2019-04-07 00:52 wmqiang 阅读(492) 评论(0) 推荐(0) 编辑
摘要: LinkedHashMap: 继承了HashMap; 其中,key不允许重复是Map接口就有的性质; HashTable: 同步的,意味着是单线程,意味着线程安全的,但是速度慢,和List接口集合的子类vector有点相同命运; key和value都不允许为空; 现在是高并发多线程的时代,线程不安全 阅读全文
posted @ 2019-04-07 00:32 wmqiang 阅读(431) 评论(0) 推荐(0) 编辑