zoukankan      html  css  js  c++  java
  • 多线程

    ======多线程======
    题引:多进程,多任务,多线程----操作系统资源。 与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();
         }
    }
  • 相关阅读:
    垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
    自考感悟,话谈备忘录模式
    [每日一题] OCP1z0-047 :2013-07-26 alter table set unused之后各种情况处理
    Java实现 蓝桥杯 算法提高 p1001
    Java实现 蓝桥杯 算法提高 拿糖果
    Java实现 蓝桥杯 算法提高 拿糖果
    Java实现 蓝桥杯 算法提高 求arccos值
    Java实现 蓝桥杯 算法提高 求arccos值
    Java实现 蓝桥杯 算法提高 因式分解
    Java实现 蓝桥杯 算法提高 因式分解
  • 原文地址:https://www.cnblogs.com/nin-w/p/5907476.html
Copyright © 2011-2022 走看看