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

广州大型网站建设公司排名奢侈品网站策划方案

广州大型网站建设公司排名,奢侈品网站策划方案,百度申请完域名怎么建设网站,网站制作公司兴田德润实力强文章目录 线程在 Java 代码中编写多线程程序Thread 标准库 创建线程的写法1 . 继承 Thread 类代码回调函数休眠操作#xff1a;sleep()抢占式执行观察线程jconsoleIDEA 内置调试器 2 . 实现 Runnable 接口代码 3. 匿名内部类创建 Thread ⼦类对象代码匿名内部类 4.匿名内部类创… 文章目录 线程在 Java 代码中编写多线程程序Thread 标准库 创建线程的写法1 . 继承 Thread 类代码回调函数休眠操作sleep()抢占式执行观察线程jconsoleIDEA 内置调试器 2 . 实现 Runnable 接口代码 3. 匿名内部类创建 Thread ⼦类对象代码匿名内部类 4.匿名内部类创建Runnable⼦类对象代码 5.lambda 表达式创建 Runnable ⼦类对象 线程 可以理解成更轻量的进程也能解决[[01 计算机是如何工作的#^87b85a|并发编程]]的问题但是创建/销毁的开销要比进程更低 因此多线程编程就成了当下主流的并发编程方式 这个基本上是我们以后工作中天天用到面试中考查的重点 #高频面试 在系统中线程同样是通过 [[01 计算机是如何工作的#^7eb7b0|PCB]] 来描述的Linux 一个进程是一组 PCB一个线程是一个 PCB 一个进程中可以包含多个线程 此时每个线程都可以独立的去 CPU 上调度执行 线程是系统“调度执行”的基本单位进程是系统“资源分配”的基本单位 一个可执行程序运行的时候双击 操作系统会创建进程给这个程序分配各种系统资源CPU内存硬盘网络带宽…同时也会在这个进程中创建一个或多个线程这些线程再去 CPU 上调度执行 同一个进程中的线程共用同一份资源 线程比进程更轻量主要体现在可以资源共用 创建线程省去了“分配资源”的过程销毁进程省去了“释放资源”的过程 一旦创建进程同时也会创建第一个线程分配资源时间相对来说较慢 一旦后续创建第二个、三个线程就不必再重新分配资源了用创建第一个线程时分配的资源 当线程数目越来越多之后此时效率也没办法进一步提升了桌子的空间是有限的当滑稽老铁数目达到一定程度后有些人就够不到桌子了就吃不到了 能够提升效率关键是充分利用多核心进行“并行执行” 如果只是“微观并发”速度是没有提升的真正能提升速度的是“并行” 如果线程数目太多比如超出了 CPU 核心数目此时就无法在微观上完成所有线程的“并行执行”势必会存在严重的竞争 当线程多了之后此时就容易发生“冲突” 由于多个线程使用的是同一份资源内存资源 若多个线程针对同一个变量进行读写操作尤其是写操作就容易发生冲突 一旦发生冲突就可能使程序出现问题“线程安全问题” 一旦某个线程抛出异常这个时候如果不能妥善处理就可能导致整个进程都崩溃因此其他线程就会随之崩溃 进程和线程的概念与区别高频面试题操作系统话题下出场频率最高的问题 #高频面试 进程包含线程 一个进程里面可以有多个线程 进程是系统资源分配的基本单位 线程是系统调度执行的基本单位同一个进程的线程之间共用一份系统资源内存硬盘网络带宽等 尤其是“内存资源”就是代码中定义的变量/对象…编程中多个线程是可以共用一份变量的 线程是当下实现并发编程的主流方式通过多线程就可以充分利用好多核 CPU 但也不是线程数越多就一定越好当线程数达到一定的程度把多个核心都利用充分之后再增加线程就无法再提高效率了甚至可能会影响效率线程调度也是有开销的 多个线程之间可能会相互影响 线程安全问题一个线程抛出异常也可能会把其他线程也一起带走 多个进程之间一般不会相互影响 进程的隔离型一个进程崩溃了不会影响其他进程 在 Java 代码中编写多线程程序 线程本身是操作系统提供的概念操作系统提供 API 供程序猿调用 但不同的系统提供的 API 是不同的Windows 创建线程的 API 和 Linux 的差别非常大JavaJVM把这些系统 API 封装好了咱们不需要关注系统原生 API只需要了解好 Java 提供的这一套 API 就好了 Thread 标准库 这个类负责完成多线程的相关开发 创建线程的写法 1 . 继承 Thread 类 代码 package thread; class MyThread extends Thread { //继承Thread类的目的是重写里面的run()方法 Override public void run() { //这里写的代码就是即将创建的线程所需要执行的逻辑 while (true) { System.out.println(hello thread); //休眠操作避免CPU消耗过大 try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } }} } public class Demo1 { public static void main(String[] args) { MyThread t new MyThread(); //创建线程与主线程各自独立并发执行 t.start(); //t.run(); 不会创建新线程在主线程中执行但执行不到//因为由于不是线程所以不会并发执行所以一直执行创建的MyThread线程死循环while(true) { System.out.println(hello main); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } }} }这个代码运行起来是一个进程但包含了两个线程 主线程——main 方法每个进程必有 自创建的新线程——t.start() 随后主线程和新线程就会并发/并行的在 CPU 上执行 创建一个类继承于标准库的 Thread并重写 run() 方法 Thread 类可以直接被继承因为它来自 java. lang 这个包而这个包是默认导入的里面所有的类都可以直接使用继承 Thread 类的主要目的是重写 run() 方法run() 中的方法就是即将创建出的线程要执行的逻辑 在 main 方法里创建刚才那个类的实例再使用提供的 start() 方法来创建线程 调用 run() 就会在进程内部创建出一个新的线程新的线程就会执行刚才 run 里面的代码线程明细 主线程调用 main 函数的方法需要一个专门的线程来执行称为主线程t1.start();这是创建的一个新进程与主线程之间是并发/并行关系在 CPU 上执行 这里调用 start() 是创建了一个新的线程随后执行新线程里面的逻辑而直接调用 run() 方法的话不会创建新的线程 运行结果 回调函数 非常重要的概念 run() 方法并没有被手动调用但是最终也执行了这种被用户定义了但没手动调用的方法最终是被系统/库/框架调用了此时这样的方法就叫“回调函数callback” Java 数据结构中优先级队列堆必须先定义好对象的“比较规则”ComparablecompareTo comparatorcompare 都是自己定义了但没有调用此时都是由标准库本身内部的逻辑负责调用的 休眠操作sleep() 可以让循环每循环一次就休息一下避免 CPU 消耗过大。单位是 ms毫秒1000 ms 1 s这是一个静态方法类方法 可以直接通过类名进行访问 类名. 方法名不需要实例化对象通过对象来访问 这里会报错使用 AltEnter IDEA 自动生成 try/catchcatch 中默认的代码有两种风格 再次抛出一个异常throw new RuntimeException(e);只是打印异常信息e.printStackTrace(); 但实际开发中不止这俩 可能进行“重试”可能进行“回滚”可能会通过短信/邮件/微信/电话向程序猿报警 抢占式执行 多个线程之间谁先去 CPU 上调度执行这个过程是“不确定的”这个调度顺序取决于内核里面的“调度器”的实现 调度器里面有一套规则但是我们作为程序开发没法进行干预也感受不到只能把这个过程近似于随机 观察线程 jconsole 可以借助第三方工具来看这两个进程的情况 JDK 中的 bin 目录binary 二进制里面放的都是可执行程序 通过这个可以看到 Java 中进程运行情况 远程进程其他机器上的进程需要通过网络连接本地进程正在运行的进程 一个 Java 线程中不仅仅只有一个线程其实有很多代码中自己创建的线程命名的规律是 Thread-数字 主要的线程主线程和自己创建的线程 调用栈非常有用 当代码出现问题抛出异常进程终止时可以查看对应的调用栈找到出现问题的语句以及这个代码是如何一层一层被调用过去的 其他进程主要起到辅助作用 垃圾回收在合适的时机释放不使用的对象统计信息/调试信息比如现在通过 jconsole 能查看到一个 Java 进程的详情 IDEA 内置调试器 通过 IDEA 内置的调试器也能看到类似的信息 2 . 实现 Runnable 接口 代码 package thread; //通过Runnable的方式来创建线程 class MyRunnable implements Runnable { Override public void run() { //描述线程要完成的逻辑 while (true) { System.out.println(hello thread); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } } } public class Demo2 { public static void main(String[] args) throws InterruptedException { MyRunnable runnable new MyRunnable(); Thread thread new Thread(runnable); //通过Thread创建线程线程要执行的任务是通过Runnable来描述的不是通过Thread自己thread.start(); while (true) { System.out.println(hello main); Thread.sleep(1000); }} }因为 Runnable 是一个 interface接口所以要用 implements实现 Runnable 是用来描述“要执行的任务”是什么 通过 Thread 创建线程线程要执行的任务是通过 Runnable 来描述的不是通过 Thread 自己来描述的 两种本质上差别不大第二种更利于“解耦和” 这个 Runnable 只是一个任务并不与“线程”这样的概念强相关 后续执行这个任务的载体可以是线程也可以是其他的东西 [!quote] 协程、纤程 线程是轻量级进程但进程很重随着对性能要求的提高开始嫌弃线程引入协程也叫做虚拟线程 3. 匿名内部类创建 Thread ⼦类对象 本质是继承 Thread和 1 一样 代码 package thread; public class Demo3 { public static void main(String[] args) throws InterruptedException { Thread thread new Thread() { //这里就是在定义匿名内部类这个类是Thread的子类 public void run() { //在类内部重写run方法 while (true) { System.out.println(hello thread); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } } }; thread.start(); while (true) { System.out.println(hello main); Thread.sleep(1000); } } }匿名内部类 [!quote] 匿名内部类 一般是一次性的用完就丢了内聚性更好一些 相关联的代码放的越集中内聚性越好 Thread thread new Thread() { //这里就是在定义匿名内部类这个类是Thread的子类 public void run() { //在类内部重写run方法 } };这一段代码的解释 定义匿名内部类这个类是 Thread 的子类类的内部重写了父类的 run 方法创建了一个子类的实例并且把实例的引用复制给了 thread 4.匿名内部类创建Runnable⼦类对象 本质是通过匿名内部类实现 代码 package thread; public class Demo4 { public static void main(String[] args) throws InterruptedException { Runnable runnable new Runnable() { Override public void run() { while (true) { System.out.println(hello thread); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } } }; Thread thread new Thread(runnable); thread.start(); while (true) { System.out.println(hello main); Thread.sleep(1000); } } }5.lambda 表达式创建 Runnable ⼦类对象 本质上就是匿名内部类是一个更简化的写法很多时候写“匿名内部类”目的不是写“类”而是为了写那个 run() 方法lambda 可以直接表示我们要写的 run() 方法省去了一些不需要的部分 public static void main(String[] args) { Thread thread new Thread(() - { while(true){ System.out.println(hello thread); try{ Thread.sleep(1000); }catch(InterruptedException e){ throw new RuntimeException(e); } } }); thread.start(); while(true){ System.out.println(hello main); try{ Thread.sleep(1000); }catch(InterruptedException e){ throw new RuntimeException(e); } } }
http://www.w-s-a.com/news/183779/

相关文章:

  • 用ps怎么做网站的效果图互联网营销师报名入口官网
  • 网站的后端怎么开发网站 白名单
  • 济宁中小企业网站建设wordpress爆破工具
  • 零基础网站建设视频商城系统平台有哪些
  • 那个网站做百科好过wordpress删除
  • 优化网站排名怎么制作网站建设数据库模板
  • 哪个建站软件比较好带论坛都有什么公司需要网站建设
  • 同城便民网站开发自己免费怎么制作网站吗
  • 数据库网站开发教程网站内部优化是什么意思
  • 哈尔滨建站怎么做广西seo快速排名
  • 公司网站建设的不足企业文档管理wordpress
  • .net做的网站代码网站怎么加二级域名
  • 网站建设方案对比分析报告成都短视频代运营
  • 企业所得税税率知多少重庆seo什么意思
  • ftp如何修改网站备案号百度云建站
  • 免费做网站空间dede二手车网站源码
  • 网站服务器需要多大设计网站公司开发
  • asp 网站权限设计做网站业务员
  • 做棋牌网站违法嘛网络服务网络推广
  • 专门做推广的网站吗免费建域名网站
  • 在百度做网站株洲网站平台搭建
  • 用node做的网站南宁网站定制开发
  • 做刷单网站犯法吗wordpress depth
  • 潍坊青州网站建设少儿编程app
  • 表白网站制作源代码自己怎么免费做网站网页
  • 开源网站建设是什么工作个人虚拟网站
  • 网站制作的一般过程优化关键词排名公司
  • 如何使用阿里云建设网站网站两边广告
  • 互联网信息服务小红书seo是什么意思
  • 深圳市南山区建设局网站公司简介网页