多线程

======多线程======
题引:多进程,多任务,多线程----操作系统资源。 与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();
     }
}
原文地址:https://www.cnblogs.com/nin-w/p/5907476.html