制作卡牌的网站,wordpress自动广告,用vs2010做网站论文,xp怎么做网站文章目录 关键词1.什么是多线程以及使用场景?2.并发与并行3.多线程实现3.1继承 Thread 类实现3.2Runnable 接口方式实现3.3Callable接口/Future接口实现3.4三种方式总结 4.常见的成员方法#xff08;重点记忆#xff09;94.1setName/currentThread/sleep要点4.2线程的优先级… 文章目录 关键词1.什么是多线程以及使用场景?2.并发与并行3.多线程实现3.1继承 Thread 类实现3.2Runnable 接口方式实现3.3Callable接口/Future接口实现3.4三种方式总结 4.常见的成员方法重点记忆94.1setName/currentThread/sleep要点4.2线程的优先级10档priority4.3守护/备胎线程Daemon4.4礼让/出让继承yield又得了解4.5插入线程join了解 5.线程的生命周期6.线程的安全问题synchronized6.1产生的问题6.2为什么产生6.3解决方法6.3.1同步代码块6.3.2同步方法 6.4扩展 7.lock锁jdk5出现8.死锁9.等待唤醒机制生产者和消费者9.1思路分析9.2常见方法(单个桌子实现)9.3吃货与桌子代码9.4厨师和main代码9.5阻塞队列实现厨师吃货类测试类 10.java线程状态 关键词
3.1 Thread
3.2 Runnable
3.3 Callable/FutureTask
4 setName()、getName()、currentThread()、sleep()、
setPriority()、getPriority()、setDaemon()、yield()、join()
6 synchronized
7 static Lock lock new ReentrantLock();
9.2 wait()、notify()、notifyAll()
9.5 ArrayBlockingQueue【put、take】、LinkedBlockQueue
1.什么是多线程以及使用场景?
应用软件种互相独立的可以同时运行的功能就形成了多线程
例子360杀毒软件中有木马查杀、电脑清理、系统修复、优化加速等可以同时运行的功能
场景
1.拷贝迁移大文件的时候多线程可以运行其他功能
2.加载大量资源文件例如打开游戏时加载资源文件加载这些的同时检查游戏版本播放背景音乐 2.并发与并行
并发同一时刻多条指令在单个CPU交替执行
并行同一时刻多条指令在多个CPU同时执行
3.多线程实现
3.1继承 Thread 类实现
每一个创建出来的线程都是独立的需要共享数据用static修饰常量 从这里可以看出代码是交替执行的并发
3.2Runnable 接口方式实现
由于是以参数的形式创建的线程所以只会创建一次 3.3Callable接口/Future接口实现 3.4三种方式总结 前两种无法获取多线程运行的结果由于重写的run方法是void没有返回值第三种有返回值
4.常见的成员方法重点记忆9 4.1setName/currentThread/sleep要点 4.2线程的优先级10档priority
关键词抢占式调度随机非抢占式调度
优先级越高抢到CPU执行权的概率越高
参考代码 4.3守护/备胎线程Daemon
备胎线程陆续结束不会全部执行完毕 应用场景
线程1聊天窗口要是关闭了那么线程2没有执行的必要了所以线程2可以设置成守护线程 4.4礼让/出让继承yield又得了解
主要作用让线程的执行尽可能均匀一点 4.5插入线程join了解 5.线程的生命周期 6.线程的安全问题synchronized
6.1产生的问题
1.三个窗口买票共100张看作三个线程进行卖票由于线程独立导致卖了300张票
2.线程设置static修饰共享可是依然会有超出范围的票和重复的票被卖出
6.2为什么产生
**问题1**例如设置了sleep在if条件中满足的都会进入执行代码线程1执行了1操作刚到打印语句线程2也执行了1操作此时值就是2那么线程1打印的值为2线程2也是2 **问题2**三个线程进入if的时候都满足条件线程1为99时进入if没有执行打印语句的时候就是100此时还没有打印线程2进入就是101再线程3进入就是102
6.3解决方法
6.3.1同步代码块
把操作共享的代码锁起来也就是给代码块上锁 **细节1**synchronzied要写在while里面不然线程1抢到执行权那么就会上锁线程2 3无法执行线程1解锁那么100张票已经卖完
**细节2**锁对象要是唯一的Object字节码对象如果是两把不同的锁A锁打开进入后关闭线程1没有来就会一直锁着线程2进不去要是有B锁作为锁对象那么B锁未被占用可以打开进入执行那么上锁就没有意义了eg用this作为锁对象那么锁就是不唯一的
6.3.2同步方法
把synchronized关键字加到方法上配合Runnable接口使用可以不考虑锁对象是否唯一 6.4扩展
StringBuilder单线程使用多线程不安全
StringBuffer多线程使用相比StringBuilder该类的方法都是用synchronized进行了同步
7.lock锁jdk5出现
用于解决synchronized关键字不能手动枷锁的问题 标准写法 由于线程1执行到break会跳出循环那么可定不会执行到释放锁的操作那么线程永远不会停止我们就可以将lock.unlock()写在finally方法体中finally会在前面两个执行完成后执行无论try是否抛出异常或者catch是否捕获异常
8.死锁
操作系统学过循环等待不可剥夺避免写这样的代码即可
9.等待唤醒机制生产者和消费者
9.1思路分析 9.2常见方法(单个桌子实现) 9.3吃货与桌子代码 9.4厨师和main代码 9.5阻塞队列实现 阻塞队列底层已经有锁不需要再枷锁
厨师吃货类 测试类 10.java线程状态 是没有运行状态的当线程抢到cpu执行权的时候就会交给操作系统去管理jvm就不管了