zoukankan      html  css  js  c++  java
  • JAVA中的多线程

    进程和线程的概述

    进程是指运行中的应用程序,每一个进程都有自己独立的内存空间,一个应用程序可以同时启动多个进程!

    线程是指一个进程中的执行流程,有时也称为执行情景,一个进程可以有多个线程组成,即在一个进程中可以运行多个线程,他们分别执行不同的任务,当多个线程同时运行时,这种运行方式称为并发运行,

    进程和线程的主要区别在于每一个进程都需要操作系统为其分配独立的内存空间,而同一进程内的所有线程都共享同一块内存地址空间,比如同一个对象的资源或打开的文件。

    JAVA线程的运行机制

    在java虚拟机中代码的执行是由线程来完成的,每一个线程都有一个程序技术器和方法调用栈(method invocation stack)

    • 程序计数器:当线程执行一个方法是,程序计数器指向方法区中下一条要执行的字节码指令
    • 方法调用栈:用来跟踪线程中的一系列方法调用过程,栈中的元素成为栈帧,每当线程调用一个方法时都会在栈中压如一个栈帧,栈帧用来保存方法的参数、局部变量和运算过程中的临时数据

    栈帧由一下三部分组成

    • 局部变量区:用来存放局部变量及方法的参数
    • 操作数去:是线程的工作区,存放方法中的临时数据
    • 栈数据区:为线程指令提供相关的信息,包括如何定位到位于堆区和方法区的特定数据,及如何正常退出方法或异常中断方法。
      1 public class smaple{
      2               private int a;
      3               public int method(){
      4                      int b=0;
      5                      a++;
      6                      b=a;
      7                      return b;
      8               }
      9               public static void main(String[] args) {
     10                      smaple s=null;
     11                      int a=0;
     12                      s=new smaple;
     13                      a=s.method();
     14                      System.out.println(a);
     15               }
     16        }
    demo

    当上面代码执行到a++时运行时数据的状态图如下

    image

    当method()方法执行结束后它的栈帧就会从方法栈中弹出,它的局部变量b结束生命周期。Main方法的栈帧成为当前帧。主线程继续执行main放法。

    线程的创建和启动

    创建线程的两种方法

    • 扩展java.long.Thread类
    • 实现Runnable接口

    Thread类

    Thread类是线程类,他有两个主要的方法

    Run:包含线程运行时所包含的代码

    Start:用于启动线程

    调整各个线程的优先级

    所有线程根据优先级等及存放在可运行池中。优先级较低的线程获得较少的运行机会,优先级较高的线程获得较高的运行机会Thread类的SePriority(int)和GetPriority()用来设置和读取线程的优先级优先级用整数表示取值范围是1~10.

    线程休眠Thread.sleep(int)方法

    当一个线程执行Thread.sleep(int)方法是,该线程放弃CPU的使用权装入阻塞状态。该方法接收一个int类型参数表示该线程进入阻塞状态的时间一毫秒为单位。

    线程让步Thread.yield()方法

    当一个线程在运行时执行Thread.yield方法时。如果此时有和该线程有同样优先级的其他线程处于就绪状态。则将该线程放入运行池,让另一线程占用CPU运行,如果没有则Thread.yield方法什么也不做

    等待其他线程结束join方法

    当一个线程在运行时调用另一个线程的join方法时,当前线程进入阻塞状态直至另一个线程运行结束他才会回复运行

    后台线程

    后台线程的特点:后台线程与前台线程相伴相生,只有所有前台线程结束生命周期,后台线程才会结束成名周期。只有有一个前台线程存在后台线程就不会结束生命周期。

    主线程在默认情况下式前台线程,有前台线程创建的线程在默认情况下也是前台线程,可以通过Thread类的SetDaemo(true)来将一个线程设置为后台线程。Thread类的IsDaemon()方法用来判断一个线程是否是后台线程。

    使用后台线程的注意点:

    • Java虚拟机能保证的是,当所有前台线程的生命周期结束是如果后台线程还在运行则终止后台线程,但后台线程不一定在前台线程结束后结束。
    • 只有在线程启动前(调用start方法前)才能将它设置为后台线程。否则将导致IllegalThreadStateException异常
    • 由前台线程创建的线程在默认情况下仍然是前台线程,由后台线程创建的线程在默认情况下仍然是后台线程。
  • 相关阅读:
    vscode前端必备插件-提高开发效率-起飞-图文-简介
    Python使用yagmail超简单发送邮件、keyring读取密钥、schedule定时任务、imbox操作
    Django中自定义管理类
    Diango中的模型成员
    Django中的Q查询
    【Windows】垃圾清理
    【RabbitMQ】三、交换器和队列
    对酒店房间自助售货机的支付漏洞挖掘
    记录第二次“梅花三弄”的渗透之旅
    Web渗透测试:信息收集篇
  • 原文地址:https://www.cnblogs.com/wangzheand/p/5430209.html
Copyright © 2011-2022 走看看