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

工信部网站实名认证怎么做百度搜索引擎api

工信部网站实名认证怎么做,百度搜索引擎api,企业门户网站建设,酷家乐设计家官网文章目录 前言我们为什么要使用线程而不是进程来实现并发编程什么是线程进程和线程的区别如何使用Java实现多线程创建线程1.创建一个继承 Thread 类的线程类2.实现 Runnable 接口匿名内部类方式实现 Runnable 接口lambda 表达式实现 Runnable 接口 Thread 类的常见构造方法Thre… 文章目录 前言我们为什么要使用线程而不是进程来实现并发编程什么是线程进程和线程的区别如何使用Java实现多线程创建线程1.创建一个继承 Thread 类的线程类2.实现 Runnable 接口匿名内部类方式实现 Runnable 接口lambda 表达式实现 Runnable 接口 Thread 类的常见构造方法Thread 的几个常见属性启动线程终止线程1.自定义标志位终止线程2.使用 Thread 自带的标志位终止线程 线程等待 前言 前面我们了解了什么是进程以及如何实现进程调度那么今天我将为大家分享关于线程相关的知识。在学习线程之前我们认为进程是操作系统执行独立执行的单位但其实并不然。线程是操作系统中能够独立执行的最小单元。只有掌握了什么是线程我们才能实现后面的并发编程。 我们为什么要使用线程而不是进程来实现并发编程 实现并发编程为什么不使用多进程而是使用多线程呢主要体现在几个方面 创建一个进程的开销很大调度一个进程的开销很大销毁一个进程的开销很大 开销不仅体现在时间上还体现在内存和 CPU 上。现在以”快“著称的互联网时代这种大开销是不受人们欢迎的。那么为什么多线程就可以实现快捷的并发编程呢 共享资源多个线程之间共用同一部分资源大大减少了资源的浪费创建、调度、销毁的开销小相较于进程的创建、调度和销毁线程的创建、调度和销毁就显得很轻量这样也大大节省了时间和资源的浪费现在的计算机 CPU 大多都是多核心模式我们的多线程模式也更能利用这些优势 什么是线程 线程是操作系统能够独立调度和执行的最小执行单元。线程是进程内的一个执行流程也可以看作是进程的子任务。与进程不同线程在进程内部创建和管理并且与同一进程中的其他线程共享相同的地址空间和系统资源。 只有当第一个线程创建的时候会有较大的开销后面线程的创建开销就会小一点。并发编程会尽量保证每一个线程在不同的核心上单独执行互不干扰但也不可避免的出现在单核处理器系统中线程在一个 CPU 核心上运行它们通过时间片轮转调度算法使得多个线程轮流执行给我们一种同时执行感觉。 线程是操作系统调度执行的基本单位 进程和线程的区别 一个进程中可以包含一个线程也可以包含多个线程。 资源和隔离进程是操作系统中的一个独立执行单位具有独立的内存空间、文件描述符、打开的文件、网络连接等系统资源。每个进程都拥有自己的地址空间进程间的数据不共享。而线程是进程内的执行流程共享同一进程的地址空间和系统资源可以直接访问和修改相同的数据。 创建和销毁开销相对于进程线程的创建和销毁开销较小。线程的创建通常只涉及创建一个新的执行上下文和一些少量的内存。而进程的创建需要分配独立的内存空间、加载可执行文件、建立进程控制块等操作开销较大。 并发性和响应性由于线程共享进程的地址空间多个线程可以在同一进程内并发执行任务共享数据和通信更加方便。因此线程的切换成本较低可以实现更高的并发性和响应性。而进程之间通常需要进程间通信IPC的机制来进行数据交换和共享开销较大响应性较低。 管理和调度进程由操作系统负责管理和调度每个进程之间是相互独立的。而线程是在进程内部创建和管理的线程调度和切换由操作系统的线程调度器负责。线程的调度通常比进程的调度开销小线程切换更快。 安全性和稳定性由于进程之间相互独立一个进程的崩溃不会影响其他进程的正常运行因此进程具有更好的安全性和稳定性。而一个线程的错误或异常可能会导致整个进程崩溃。 前面我们所说的 PCB 其实也是针对线程来说的一个线程具有一个 PCB 属性一个进程可以含有一个或多个 PCB。 PCB 里的状态上下文优先级记账信息都是每个线程有自己的各自记录自己的但是同一个进程里的PCB之间pid是一样的内存指针和文件描述符表也是一样的。 如何使用Java实现多线程 在Java中使用一个线程大致分为以下几个步骤 创建线程启动线程终止线程线程等待 创建线程 在Java中执行线程操作依赖于 Thread 类。并且创建一个线程具有多种方法。 创建一个线程类继承自 Thread 类实现 Runnable 接口 1.创建一个继承 Thread 类的线程类 class MyThread extends Thread {Overridepublic void run() {System.out.println(这是一个MyThread线程);} }我们需要重写 run 方法而 run 方法是指该线程要干什么。 创建实例对象 public class TreadDemo1 {public static void main(String[] args) {Thread t new MyThread();} }2.实现 Runnable 接口 创建一个线程我们不仅可以直接创建一个继承自 Thread 的线程类我们也可以直接实现 Runnable 接口因为通过源码我们可以知道 Thread 类也实现了 Runnable 接口。 我们可以将 Runnable 作为一个构造方法的参数传进去。 class MyRunnable implements Runnable {Overridepublic void run() {System.out.println(这是一个线程);} }public class ThreadDemo2 {public static void main(String[] args) {Thread t new Thread(new MyRunnable());} }但是这种实现 Runnable 接口的方式会显得很麻烦因为每个线程执行的内容大多是不同的所以我们可以采用下面两种方式来实现 Runnable 接口。 匿名内部类lambda 表达式 匿名内部类方式实现 Runnable 接口 public class ThreadDemo3 {public static void main(String[] args) {Thread t new Thread(new Runnable() {Overridepublic void run() {System.out.println(这是一个线程);}});} }lambda 表达式实现 Runnable 接口 public class ThreadDemo4 {public static void main(String[] args) {Thread t new Thread(() - {System.out.println(这是一个线程);});} }Thread 类的常见构造方法 方法说明Thread()创建对象Thread(Runnable target)使用 Runnable 对象创建线程对象Thread(String name)创建线程对象并命名Thread(Runnable target,String name)使用 Runnable 对象创建线程对象并命名Thread(ThreadGroup group,Runnable target线程可以被用来分组管理分好的组即为线程组这个我们目前了解即可 Thread 类有很多构造方法大家有兴趣可以自己去看看。 Thread 的几个常见属性 属性获取方法IDgetId()名称getName()状态getState()优先级getPriority()是否后台进程isDaemon()是否存活isAlive是否被中断isInterrupted() ID 是线程的唯一标识不同线程不会重复名称是各种调试工具用到状态表示线程当前所处的一个情况优先级高的线程理论上来说更容易被调度到关于后台线程需要记住一点JVM会在一个进程的所有非后台线程结束后才会结束运行。是否存活即简单的理解为 run 方法是否运行结束了线程的中断问题下面我们进一步说明 我们前面创建的都是前台进程我们可以感知到的那么什么叫做后台进程呢 后台进程是指在计算机系统中以低优先级运行且不与用户交互的进程。与前台进程相比后台进程在运行时不会占据用户界面或终端窗口并且通常在后台默默地执行任务。 后台进程通常用于执行系统服务、长时间运行的任务、系统维护或监控等。它们在后台运行不需要用户的直接参与或操作而且可以持续运行即使用户退出或注销系统。 启动线程 我们上面只是创建了线程要想让线程真正的起作用我们需要手动启动线程。线程对象.start() class MyRunnable implements Runnable {Overridepublic void run() {System.out.println(这是一个线程);} }public class ThreadDemo2 {public static void main(String[] args) {Thread t new Thread(new MyRunnable());t.start();} }这里有人看到输出结果可能会问了这跟我直接调用 run 方法好像没什么区别吧我们这个代码肯定看不出来区别所以我们稍稍修改一下代码。 class MyRunnable implements Runnable {Overridepublic void run() {while(true) {System.out.println(hello MyThread!);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}} }public class ThreadDemo2 {public static void main(String[] args) {Thread t new Thread(new MyRunnable());t.start();while(true) {System.out.println(hello main!);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}} }这里 Thread.sleep() 的作用是使线程停止一会防止进行的太快我们不容易看到结果并且这里的 Thread.sleep() 方法还需要我们抛出异常 我们可以看到这里的执行结果是 main 线程和 t 线程都执行了而不是只执行其中的一个线程。不仅如此这两个线程之间没有什么规定的顺序执行而是随机的这种叫做抢占式执行每个线程都会争抢资源所以会导致执行顺序的不确定也正是因为多线程的抢占式执行会导致后面的线程安全问题。 那么我们再来看看如果直接调用 run 方法而不是 start 方法会有什么结果。 当直接调用 run 方法的话也就只会执行 t 对象的 run 方法而没有执行 main 方法后面的代码也就是说当直接调用 run 方法的时候线程并没有真正的启动只有调用 start 方法线程才会启动。 我们也可以通过 Java 自带的 jconsle 来查看当前有哪些Java进程。 我们需要找到 jconsole.exe 可执行程序。通常在这个目录下C:\Program Files\Java\jdk1.8.0_192\bin 我们也可以点进来看看。 终止线程 通常当主线程 main 执行完 mian 方法之后或者其他线程执行完 run 方法之后线程就会终止但是我们也可以在这之前手动终止线程。但是我们这里终止线程并不是立刻终止也就相当于这里只是建议他这个线程停止具体要不要停止得看线程的判断。 自定义标志位来终止线程使用 Thread 自带的标志位来终止线程 1.自定义标志位终止线程 public class ThreadDemo4 {private static boolean flg false; //定义一个标志位public static void main(String[] args) {Thread t new Thread(() - {while(!flg) {System.out.println(hello mythread!);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();System.out.println(线程开始);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}flg true; /修改标志位使线程终止System.out.println(线程结束);} }2.使用 Thread 自带的标志位终止线程 可以使用 线程对象.interrupt() 来申请终止线程。并且使用 Thread.currentThread,isInterrupted() 来判断是否终止线程。 Thread.currentThread() 获取到当前线程对象 public class ThreadDemo4 {private static boolean flg false;public static void main(String[] args) {Thread t new Thread(() - {while(!Thread.currentThread().isInterrupted()) {System.out.println(hello mythread!);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();System.out.println(线程开始);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}t.interrupt();System.out.println(线程结束);} }发现了没这里抛出了异常但是线程并没有终止为什么呢问题出在哪里呢 其实这里问题出在 Thread.sleep 上如果线程在 sleep 中休眠此时调用 interrupt() 会终止休眠并且唤醒该线程这里会触发 sleep 内部的异常所以我们上面的运行结果就抛出了异常。那么为什么线程又被唤醒了呢 interrupt 会做两件事 把线程内部的标志位给设置成true也就是 !Thread.current.isInterrupt() 的结果为true如果线程在进行 sleep 就会触发吟唱把 sleep 唤醒 但是 sleep 在唤醒的时候还会做一件事把刚才设置的这个标志位再设置回false清空标志位所以就导致了线程继续执行。那么如何解决呢 很简单因为 sleep 内部发生了异常并且我们捕获到了异常所以我们只需要在 catch 中添加 break 就行了。 try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();break;}这也就相当于我 t 线程拒绝了你的终止请求。 线程等待 在多线程中可以使用 线程对象.join() 来使一个线程等待另一个线程执行完或者等待多长时间后再开始自己的线程。 方法说明public void join()等待线程结束public void join(long millis)等待线程结束最多等 millis 毫秒public void join(long millis,int nanos)同理但可以更高精度 public class ThreadDemo5 {public static void main(String[] args) {Thread t new Thread(() - {for(int i 0; i 5; i) {System.out.println(hello mythread!);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();try {t.join();} catch (InterruptedException e) {throw new RuntimeException(e);}for(int i 0; i 5; i) {System.out.println(hello main!);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}} }在那个线程中调用的 线程对象.join() 就是哪个线程等待而哪个线程调用 join() 方法那么这个线程就是被等待的。而这个等待的过程也被称为阻塞。如果在执行 join 的时候调用 join 方法的线程如果已经结束了那么就不会发生阻塞。
http://www.pierceye.com/news/210973/

相关文章:

  • 机关门户网站建设管理情况软件开发工具都有哪些
  • 官方网站建设专家磐石网络wordpress对应的id
  • 学生自做网站优秀作品徐州企业建站模板
  • 网络电子商务购物网站idc机房建设
  • 网站单页seo个人服务器网站备案
  • 装修队伍做网站做机票在线预订网站
  • 手机版企业网站php山西建设执业注册中心网站
  • 南充网站建设略奥科技凡科建站电话
  • 个人网站可以做自媒体吗手机网站建设需要多少钱
  • 网站 模板网站什么英文字体
  • 北京市朝阳区住房建设网站图片在线编辑网站
  • 柳州市诚信体系建设网站网站数据库网络错误
  • 微站网站vps lnmp wordpress
  • 哪里有网站建设哪家好word做网站框架
  • 企业建网站的费用百度掘金入口官网
  • 德洲网站建设wordpress的title设置
  • 苏州企业网站制作服务河北关键词排名推广
  • 营销型集团网站建设镇江网站推广
  • 怎样才能制做免费网站golang 网站开发 开源
  • 哈尔滨做网站哪好免费网站模板
  • 网站怎么做才有效果如何用博客网站做cpa
  • 网站申请书博客系统做网站
  • 灰色行业老域名做网站不收录初学者的网站建设
  • 网站做成微信小程序贵州企业seo
  • 在淘宝做印刷网站怎么办wordpress 主题 edu
  • 成都设计公司网站线上线下一体化营销
  • 网站你懂我意思正能量晚上下载注册公司需要多少钱手续费
  • 在线html网站开发广州网站排名优化公司
  • 如何在免费网站上做推扩自己怎么来建设网站
  • 福安市教育局建设网站做架构图简单的网站