• 多线程


    ======多线程======
    题引:多进程,多任务,多线程----操作系统资源。 与Java本身没有关联,Java没有能力创建这些 资源。宏观上的调控,达不到微观。
     
     在操作系统中打开一个软件,就开了一个多进程。 并不是说一个软件就肯定只打开一个进程,可能是 多个进程---依赖关系---守护进程。
     
    一个进程可以完成多个任务。。。
    多任务,就是通过多线程实现。。。
    多线程有产生了进程之间的并发。。。
         并发:多个进程公用一个资源----临界资源。
      
         注意点:在同一个时间点,只有一个线程走。   启动了一个程序,jvm会首先创建这个main的线程,
         主线程。
         当进程被创建的时候,操作系统--cpu为其分配资源,
         内存资源----所有的程序运行,必须运行在内存中。
             软件1----进程1-----10M---任务1---1/1001
         时间片段:1/1001
             一个进程有10个线程--1/10000
         争夺资源的时候,能不能争夺到,争夺多少。。CPU定。
     
     
    ===================================
    1.什么线程?
     
       操作系统 一个 概念。
       运行中的程序--线程----内存资源,计数器,寄存器。。。
       通过小案例:直观感受线程---线程改变了程序的运行顺序。
       cpu 执行 分配 时间片 的  最小单位。
     
       多进程,多线程出现的原因:充分利用cpu资源。
     
    1、什么是进程?
       就是一个独立的运行空间,
       生命周期:
          新的:创建新的进程
          运行:运行
          等待:由于外部条件不足,导致等待
          就绪:是进程可以处于可运行状态。
          死亡:进程结束,异常结束。
     
    2.线程  进程 区别?
     
       一个运行着的 app  操作系统就会为之开辟一个进程,开销管理。
     
       一个进程 至少包含一个线程。
     
     
    3.基于线程的多任务和基于进程的多任务区别?
     
       数据通信  前者  开销小
     
                      后者  开销大   
     
    4.如何实现多线程
       步骤1:
         实现 Runnable接口    run 方法
     
         继承 Thread  类---本身实现了Runnable接口
       步骤2:启动线程
     
         必须使用  Thread 对象 的start(); 
     
     5. 感受多线程:
          run叫做  线程方法
          start    本地方法
          Thread 创建     启动线程
          Runnable 创建   启动  (需要new Thread(Runnable).start())
     
    3、多线程的实现方式
       第一种:继承Thread,重写run
              run方法称之为线程方法。
              start启动线程:是一个本地方法,这个等于通知os.
              我这个线程可以运行了,最终运不运行,走不走,
              是么时候走,走多久,都是由os控制。
       Java对于线程只能宏观控制。           
       注意点:线程是cpu调度资源的最小单位。
     
       第二种:实现Runnable接口,
     
    5、线程的生命周期?
       1、创建:创建了一个线程   -----new Thread(Runnable) 
       2、就绪:线程调用了start方法,可运行的状态   -----start
       3、 运行:线程了获得了cpu的使用权。  -----run
       4、 阻塞:由于某种原因,线程暂时放弃了cpu的使用权,   -----io sleep  wait  ....知道该线程重新处于就绪状态。
             等待阻塞:程序执行了wait方法,进入等待池。
                             对象方法,不是线程方法。
             同步阻塞:sleep,让线程休眠。
                             不让当前线程独占cpu资源。
             其他阻塞:join,线程加入。yield线程让步。
       5、 消亡:线程运行结束,出现了异常,跳出run方法。   -----run执行完成
     
    6、线程调度?
       宏观控制,而不能围观控制
       第一种:线程的优先级别:1-10
               t1.setProperty(int);
               使用的是三个默认级别:
                t1.setPriority(Thread.MAX_PRIORITY);
                t2.setPriority(Thread.MIN_PRIORITY);
                t2.setPriority(Thread.NORM_PRIORITY);
       第二种调度方式:线程休眠
     
       第三种调度方式:线程等待
     
       第四种调度方式:线程join
     
       第五种调度方式:线程让步--yield
     
    7、线程同步?
       目的:就是为了解决数据的并发异常。
       多各线程操作同一份数据,导致的数据不一致。
       弟弟和妹妹共用一个柜子:柜子:临界资源。
       超市的柜子:谁拿到了这个小票,谁就使用这个对子。
                   小票:对象监视器     
       线程同步研究的就是:线程和对象监视器之间的关系。
       每一个对象本身都有一个唯一的对象监视器。
       厕所案例:厕所的坑是不是资源?
     
     
     
       /**
         *案例:打电话
         */
    public class D01 extends Thread{
         public void run(){
              for (int i = 0; i <1000; i++) {
                   System.out.println("-----"+i);
               }      
         }
    }
     
    public class D02 extends Thread{
         public void run(){
              for (int i = 0; i <1000; i++) {
                   System.out.println("======"+i);
              }         
         }
    }
     
    public class RunTest implement Runnable{
              for (int i = 0; i <1000; i++) {
                   System.out.println("*******"+i);
               }
         }
    }
     
    public class Text {
         /**
          * @param args
          */
         public static void main(String[] args) {
               D01 d01 = new D01();
               D02 d02 = new D02();
     
               RunTest r1 = new RunTest();
               Thread d3 = new Thread(r1);
     
              //线程调度
              //d01.setPriority(Thread.MIN_PRIORTY);
              //d02.setPriority(Thread.MIN_PRIORTY);
              // d03.setPriority(Thread.MAX_PRIORTY);
                      
               d02.start();
     
               try{
                  d1.join();     //join:让当前线程跟在指定线程之后
               }catch(){
                  e.printStackTrace();
               }
     
               d03.start();
         }
    }
  • 相关阅读:
    nginx优化——包括https、keepalive等
    Kubernetes+Prometheus+Grafana部署笔记
    常见的页面调度算法
    算法-求二进制数中1的个数
    C++ 关联容器详解——从内部结构到应用
    C++ 容器及选用总结
    C++ STL中迭代器失效的问题
    二维数组和指针
    Linux软连接和硬链接
    what is the virtual machine, when and why we need use it ?
  • 原文地址:https://www.cnblogs.com/nin-w/p/5907476.html
Copyright © 2020-2023  润新知