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

上海正规网站制作价格企业网站建设最新技术

上海正规网站制作价格,企业网站建设最新技术,电视台网站策划书,做啥网站能挣钱1. 线程 1.1 概念 线程又可以称为轻量级进程 #xff0c;在进程的基础上做出了改进。 一个进程在刚刚启动时#xff0c;做的第一件事就是申请内存和资源#xff0c;进程需要把依赖的代码和数据#xff0c;从磁盘加载到内存中这件事是比较耗费时间的#xff0c;有的业务…1. 线程  1.1 概念 线程又可以称为轻量级进程 在进程的基础上做出了改进。 一个进程在刚刚启动时做的第一件事就是申请内存和资源进程需要把依赖的代码和数据从磁盘加载到内存中这件事是比较耗费时间的有的业务场景可能会频繁的创建销毁进程也就导致了大量的开销。而线程则省去了分配资源和释放资源带来的开销。 1.2 线程与进程的区别  与进程相同线程也可以用PCB描述所拥有的属性也是大致相同的。不同点在于每个线程都有自己独立的系统资源而多个线程的系统资源是可以相互共享的。所以这些线程之间需要的重复的系统同资源就只需要申请一次避免了重复的开销 举个例子1线程需要资源AB  2线程需要资源BC  3线程需要资源 AC。现在1线程执行了2线程执行时就只需要申请资源 C 再到3线程执行时则不需要再申请资源了。 也不是所有线程都可以共享资源系统会把能资源共享的线程分成组就称为线程组而线程组也是进程的一部分也就是一个进程是由多个线程组成的  注意 进程是包含线程的每个线程也是一个独立的执行流可以执行一些代码并单独参与到cpu的调度中状态上下文优先级记账信息每个线程都有自己的一份每个进程有自己的资源进程中的线程共用这一份资源内存空间和文件描述符表进程是资源分配的基本单位线程是调度执行的基本单位同一个进程中的线程之间可能会互相干扰引起线程安全问题进程和进程之间不会互相影响如果同一个进程中的线程抛出异常可能会影响到其他线程把整个进程中的所有线程都终止 2. 多线程编程 写代码的时候可以使用多进程进行并发编程也可以使用多线程并发编程。 在Java中是不太推荐多进程编程的 2.1 创建线程的方法 2.1.1 继承 Thread   1.  创建Thread子类 重写run方法 class MyThread extends Thread {Overridepublic void run() {System.out.println(调用了MyThread类中的run方法);} } run方法是该线程的入口,不需要手动调用jvm会在线程创建好时自动调用 2. 创建子类的实例 Thread t new MyThread(); 3. 调用 Thread类中的start方法 t.start(); 注意 调用Thread类中的start方法才会真正调用系统api在内核中创建出线程直接调用run方法是不会创建出线程的一个Thread对象只能调用一次start方法 上面我们说了每个线程都是一个独立的执行流就相当于我们创建的线程中的run方法和main方法是同时执行的 例如以下代码 class MyThread2 extends Thread {Overridepublic void run() {while(true) {System.out.println(MyThread中的run方法);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}} } public class ThreadDemo2 {public static void main(String[] args) throws InterruptedException {Thread t new MyThread2();t.start();while(true) {System.out.println(main方法);Thread.sleep(1000);}} } 输出结果 如果把 t.start(); 改为 t.run(); 则不会打印 “main方法” 因为 t并没有创建出线程 ,run方法是在main方法的线程中执行 2.1.2 实现 Runnable接口  实现Runnable 接口重写 run方法 class MyThread3 implements Runnable {Overridepublic void run() {System.out.println(MyThread3中的run方法);} } 创建一个 MyThread3 对象作为参数传入 Thread的构造方法然后调用start public static void main(String[] args) {Thread t new Thread(new MyThread3());t.start();} 2.1.3 使用匿名内部类 public class ThreadDemo4 {public static void main(String[] args) {Thread t new Thread() {Overridepublic void run() {System.out.println(MyThread4中的run方法);}};t.start();} } public class ThreadDemo5 {public static void main(String[] args) {Thread t new Thread(new Runnable() {Overridepublic void run() {System.out.println(MyThread5中的run方法);}});t.start();} } 2.1.4 使用lambda表达式 public class ThreadDemo6 {public static void main(String[] args) {Thread t new Thread(()- {System.out.println(MyThread6中的run方法);} );t.start();} } 推荐使用这种写法。 2.2 Thread类的属性和方法 2.2.1 构造方法 Thread() 无参构造方法创建一个新的线程对象。Thread(Runnable target)  使用指定的Runnable对象作为线程的目标创建一个新的线程对象。Thread(String name) 使用指定的名称创建一个新的线程对象。Thread(Runnable target, String name) 使用指定的Runnable对象和名称创建一个新的线程对象。Thread(ThreadGroup group, Runnable target) 使用指定的线程组和Runnable对象创建一个新的线程对象。Thread(ThreadGroup group, Runnable target, String name) 使用指定的线程组、Runnable对象和名称创建一个新的线程对象。 解释每个线程都有一个名称如果没有给它命名则会默认为Thread-0Thread-1......累加。当一个线程运行时我们可以通过jdk的工具 jconsole 查看线程的状态名称等。这个工具在jdk目录底下的bin文件夹中 示例代码 public class ThreadDemo7 {public static void main(String[] args) {Thread t new Thread(() - {while(true) {System.out.println(ThreadDemo7);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}, ThreadDemo7);t.start();} }运行该代码然后打开jconsole 如图所示 我们在本地进程即可看到我们运行的ThreadDemo7点击连接即可查看线程的状态等信息 线程的名字是可以重复的 2.2.2 常见的属性 解释  id每个线程都有一个唯一的id用于标识线程。 名称线程可以设置一个可选的名称来标识自己。可以通过setName(String name)方法设置线程的名称。 状态线程在运行过程中会处于不同的状态。下面会详细讲解 优先级每个线程都有一个优先级用于指示线程在竞争CPU资源时的相对重要性。优先级范围从1到10默认为5。可以通过setPriority(int priority)方法设置线程的优先级。 是否后台进程线程可以设置为后台进程。后台进程不会阻止程序的终止当所有前台线程结束时后台线程也会自动结束。可以通过setDaemon(boolean on)方法将线程设置为后台进程 是否存活线程是否仍然存活即尚未终止。 是否被中断线程可以通过调用interrupt()方法中断自己或其他线程 以及通过interrupted()静态方法检查当前线程是否被中断并清除中断状态。 线程中断注意事项 示例代码 public class ThreadDemo8 {public static void main(String[] args) throws InterruptedException {Thread t new Thread(() - {//currentThread() 方法是获取当前线程的实例即这里的twhile(!Thread.currentThread().isInterrupted()) {System.out.println(ThreadDemo8);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(执行完毕);});t.start();Thread.sleep(5000);System.out.println(让线程结束);t.interrupt();} } 当我们运行代码结果如下 我们可以看到代码并不像我们预期的那样结束而是在继续运行 这是因为 sleep的原因因为当我们运行interrupt()时sleep()可能还未结束于是sleep就被提前唤醒了 sleep被提前唤醒会做两件事 1. 抛出InterruptedException异常 2.将Thread对象的isInterrupted标志位设置为false 所以运行完interrupt()后标志位已经被设为true但是sleep又把它改回false了所以会继续执行。我们要结局这个问题只需在catch中加一个break 2.2.3 join方法 如果我们希望某个线程在另一个线程之前执行完可以用到join方法 示例代码 public class ThreadDemo10 {public static void main(String[] args) throws InterruptedException {Thread t new Thread(() - {for(int i 0; i 5; i) {System.out.println(ThreadDemo10);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();t.join();//让main线程等待t线程执行完System.out.println(希望t线程执行完再执行这条语句);} } 运行结果 执行join后如果t线程在运行中main线程就会阻塞主动放弃去cpu上执行 直到t运行结束 除了无参数的join方法还有带参数的join方法 解释 join()死等一定会等到调用该方法的线程执行完join(long millis)带超时时间的等待如果在设定的时间内调用该方法的线程没有执行完则不会继续等待join(long millis, int nanos)带超时时间的等待精确到纳秒如果在设定的时间内调用该方法的线程没有执行完则不会继续等待 示例代码  public class ThreadDemo11 {public static void main(String[] args) throws InterruptedException {Thread t new Thread(() - {for(int i 0; i 5; i) {System.out.println(ThreadDemo11);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();//让join只等2秒如果没等到就不等了t.join(2000);System.out.println(main);} } 运行结果 interrupt() 方法可以把阻塞 等待的join提前唤醒 2.3 线程的状态 Java中有以下线程状态 NEW线程被创建但还未开始执行。RUNNABLE线程正在执行或准备开始执行。就绪状态BLOCKED锁竞争引起的阻塞。线程安全会详讲WAITING线程正在等待另一个线程的特定操作完成。不带时间的死等join()或wait()会进入这个状态TIMED_WAITING线程正在等待另一个线程的特定操作完成但设置了最大等待时间。使用sleep()方法或者带超时时间的join()方法会进入这个状态TERMINATED线程已经执行完毕结束。 示例代码 public class ThreadDemo12 {public static void main(String[] args) throws InterruptedException {Thread t new Thread(() - {for(int i 0; i 5; i) {System.out.println(ThreadDemo12);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});//线程被创建但还没开始执行System.out.println(t.getState());t.start();//线程在执行中System.out.println(t.getState());t.join();//线程执行完毕System.out.println(t.getState());} } 执行结果 我们也可以通过 jdk的jconsole工具查看线程的状态
http://www.zqtcl.cn/news/656344/

相关文章:

  • 浙江短视频seo优化网站专做童装的网站
  • 印刷包装公司网站模板陕西住房和城乡建设厅网站
  • 成都响应式网站建设公司网站 建设的必要性
  • 江苏省建设局官方网站查询wordpress收到登录错误
  • 个人与企业签订网站开发合同北京个人网站建设
  • 阀门网站设计dede静态网站
  • 做暧暧视频网站在线网站建设项目推文
  • 岳池发展建设集团有限公司门户网站毕设做网站工作量够吗
  • 手机网站客户端设计与实现手机网站 焦点图
  • 网站建设常用的开发语言介绍设计公司官网首页
  • 做网站能拿多少钱视频策划方案怎么写
  • 权威的顺德网站建设dw不会写代码能建立网站吗
  • 做网站美工的前途怎么样企业通讯软件下载
  • 客户说做网站价格高成都住建局官网住建智慧建管
  • 股票分析网站可以做推广吗网站开发 简历项目经历
  • 军人可以做网站吗学生信息管理系统网页设计教程
  • 使用循环视频做背景的网站青岛网站推广的价格
  • 邯山区建设局网站上海公司招聘
  • 做网站沈阳本地网站忧化 优帮云
  • 网上购物网站开发的目的建筑投标网站
  • 网站开发费用无形资产陕西省住房和城乡建设网站
  • 网站分析与优化如何编程写代码
  • 专业做网站企业百度站长管理平台
  • 网站组建 需求分析阿里巴巴网站装修
  • 网站建设怎么弄轮换图片网站制作公司dedecms
  • 南阳企业网站建设做兼职网站有哪些
  • ps做网站的优点国际设计师网站有哪些
  • 学校网站建立安阳市网站建设
  • 邢台做网站流程摄影工作室网站设计
  • 掉关键词网站重大军事新闻