当前位置: 首页 > ai >正文

多线程技术的概述

线程与进程
进程:

是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间

线程:

是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程最少 有一个线程 线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分 成若干个线程

线程的调度
分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。

抢占式调度
优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性), Java使用的为 抢占式调度。

CPU使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核新而言,某个时刻, 只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是 在同一时 刻运行。 其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的 使 用率更高。

同步与异步
同步:排队执行 , 效率低但是安全.
异步:同时执行 , 效率高但是数据不安全.

并发与并行
并发:指两个或多个事件在同一个时间段内发生。
并行:指两个或多个事件在同一时刻发生(同时发生)。

有两种方法:实现Runnable 与 继承 Thread.

实现Runnable 与 继承 Thread 相比有如下优势:
* 1. 通过创建任务,然后给线程分配的方式来实现多线程,更适合多个线程同时执行相同任务的情况.
* 2. 可以便面单继承所带来的局限性
* 3. 任务与线程本身是分离的,提高了程序的健壮性
* 4. 后续学习的线程池技术,接收Runnable类型的任务,不接受Thread类型线程.

代码如下:
在这里插入图片描述
线程中断:
一个线程是一个獨立的执行路径,他是否应该结束,应该由它自身来决定
代码如下
在这里插入图片描述
线程:分为守护线程 和 用户线程
用户线程: 当一个进程不包含任何的存活的用户线程时,进程结束
线程守护: 守护用户线程,当最后一个用户线程结束时,所有守护线程自动死亡
代码如下:
在这里插入图片描述
线程不安全: 多个线程同时处理,会造成不合理现象
解决方案1. 同步代码块
格式: synchronized(锁对象){}
/注意: 所有线程要看同一把锁才能排队
代码如下
在这里插入图片描述

  解决方案2. 同步方法代码如下:Runnable run = new Ticket();new Thread(run).start();new Thread(run).start();new Thread(run).start();}
static class Ticket implements Runnable{private int count =10;Object o = new Object();@Overridepublic void run() {while(true){boolean flag = sale();if (!flag){break;}}}public synchronized boolean sale(){if(count>0){//卖票System.out.println("正在准备出票");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}count--;System.out.println(Thread.currentThread().getName()+"出票成功,剩余票数:"+count);return true;}return false;}解决方案3. 显示锁 Lock 子类 ReentrantLock代码如下:Runnable run = new Ticket();new Thread(run).start();new Thread(run).start();new Thread(run).start();}
static class Ticket implements Runnable{private int count =10;//显示锁 l:fair为true就是公平锁private Lock l = new ReentrantLock(true);@Overridepublic void run() {while(true){l.lock();if(count>0){//卖票System.out.println("正在准备出票");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}count--;System.out.println(Thread.currentThread().getName()+"出票成功,剩余票数:"+count);}else{System.out.println("票已售完");break;}l.unlock();}}
http://www.xdnf.cn/news/11186.html

相关文章:

  • fireworks 投影_使用Fireworks MX 2004进行Flash图形和界面设计
  • 谷歌广告联盟(Google Adsense)通过网站获利功能在线创收
  • oracle record 类型,Oracle记录类型(record)和%rowtype
  • 计算广告所谓的计算,到底在计算什么
  • 两款工控控件对比评测:Iocomp和ProEssentials
  • Windows中DLL文件基本原理及修改方法
  • 开美股账户过程
  • Delphi DataSnap 流程分析(二)
  • robots.txt的语法和写法详解
  • 视频CDN概念和特点
  • 软件开发文档模板(全套)(规格说明书;详细设计;测试计划;验收报告)
  • SD新插件,AI生成视频,动画和模特换装
  • 经典前端框架,一个时代的落幕:如何看待layui 官网将于 2021年10月13日 进行下线?
  • 简单的base64转pdf
  • 网页设计必学:CSS四种样式引入方式及常用样式
  • 什么是SDH
  • 制作一个简单HTML电影网页设计(HTML+CSS)
  • 转载:国内从事机器视觉领域的公司
  • android_基础_editText字符过滤
  • SoftICE出现Error Code 31无法启动的解决办法
  • HTML汉字编码简明对照表
  • 常见的10种网络安全攻击类型
  • 硬件知识:USB3.0和USB2.0的区别
  • 浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)
  • 面试趣事,我遇到的一个极品老女人
  • 转载-万维网是如何工作的
  • 入手ZeroNet,我的站吼吼
  • 好奇!滴滴在 GitHub 开源了哪些有意思的项目?
  • 12 个超好用的免费在线工具建议收藏!(非常详细)从零基础入门到精通,看完这一篇就够了
  • 国内无法访问Android开发网站的解决方法