• 学习Java的第十天


    学习Java的10天

    • 程序:

      • 一组指令的集合,即指一 段静态的代码,静态对象。
    • 进程:

      • 是程序的一次执行过程,或是正在运行的一个程序。
      • 是一个动态的过程:有它自身的产生、存在和消亡的过程。——生命周期
      • 进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域 。
    • 线程:

      • 线程的理解

        • What:

          • 线程是比进程更小的执行单位,是在一个程序(也叫做一个进程)去处理多个任务,这一个任务就叫做线程。线程是来回切换的,需要加载哪个线程就加载哪个。

          • 线程共享电脑分配的同一块内存区间,使用相同的堆。

          • 特点:线程不能独立运行,必须依赖于进程,在进程中运行。每个程序至少有一个线程称为主线程

    • 开启多线程的优点和缺点

      • 提高界面程序响应速度。通过使用线程,可以将需要大量时间完成的流程在后台启动单独的线程完成,提高前台界面的相应速度。
      • 充分利用系统资源,提高效率。通过在一个程序内部同时执行多个流程,可以充分利用CPU等系统资源,从而最大限度的发挥硬件的性能。
      • 当程序中的线程数量比较多时,系统将花费大量的时间进行线程的切换,这反而会降低程序的执行效率。
      • 多个线程操作共享的内存资源,可能会带来哪个线程操作资源的问题,叫做安全隐患。
    • 线程的创建和使用 重要

    • //1.创建一个Tread类的子类
      class MyThread extends Thread {
          @Override
          public void run() {
              //2.将此线程的操作声明在run()
              for (int i = 0; i <100 ; i++) {
                  if (i % 2 == 0){
                      System.out.println(i);
                  }
              }
      
          }
      
      }
      
      public class ThreadTest {
          public static void main(String[] args) {
              //main方法中对应的就是主线程
              //3.创建子线程类的对象
              MyThread t1 = new MyThread();
              //4.通过子线程对象去调用start方法
              //4.1启动当前线程(相当于开始一个新的线程)
              //4.2调用当前线程的run方法
              t1.start();
              for (int i = 0; i <100 ; i++) {
              if (i % 2 != 0){
                      System.out.println(i+"mian()");
                  }
              }
      
          }
      }
      
      
    • 创建多个线程去执行不同的事情

      //创建两个线程 分别输出100以内的奇数和偶数
      public class Multread {
          public static void main(String[] args) {
              new Thread() {
                  @Override
                  public void run() {
                      for (int i = 0; i < 100; i++) {
                          if (i % 2 == 0) {
                              System.out.println(Thread.currentThread().getName()+i);
                          }
                      }
                  }
              }.start();
              new Thread() {
                  @Override
                  public void run() {
                      for (int i = 0; i < 100; i++) {
                          if (i % 2 != 0) {
                              System.out.println(Thread.currentThread().getName()+i);
                          }
                      }
                  }
              }.start();
      
          }
      }
      
      
    • Thread中的常用方法

      • run():将创建的线程所要执行的操作声明在此方法当中
      • start():启动当前线程,调用当前线程的run()
      • getName():获取当前线程的名称
      • setName():设置当前线程的名称
      • currentThread:静态方法,返回当前执行代码的线程
      • yield():释放当前cpu的执行权。
      • join():调用该方法时,在线程a中调用线程b的join,此时线程a就进入阻塞状态,直到线程b执行完之后,线程a才开始执行。
      • stop():强制停止该线程 不建议使用该方法
      • sleep(long millitime):让当前线程睡眠指定的时间,在指定的时间内,该线程是阻塞状态。
      • isLive():判断线程是否存活。
    • 线程的调度

      • 时间片:cpu 自动切换不同的线程

      • 抢占式:高优先级抢占cpu

      • 线程的优先级等级

        • MAX_PRIORITY:10

        • MIN _PRIORITY:1

        • NORM_PRIORITY:5

        • getPriority() :获取线程优先值

        • setPriority(int newPriority) :设置线程的优先级

        • 注意:优先级高不一定优先执行,只是说优先级高的执行概率高。

          public class TreadMethod {
              public static void main(String[] args) throws InterruptedException {
                  MyTread t1 = new MyTread();
                  Thread.currentThread().setPriority(1);
                  t1.setPriority(10);
                  //设置当前线程的优先级 一般在start之前
                 t1.start();
                 int m = Thread.currentThread().getPriority();
                 //获取当前的线程优先级 默认为2
                  System.out.println(m);
                  for (int i = 0; i <100 ; i++) {
                      System.out.println(i);
                      if (i == 3){
                          t1.join();
                      }
                  }
          
              }
          }
          
          class MyTread extends Thread {
              @Override
              public void run(){
                  for (int i = 0; i <100 ; i++) {
                      try {
                          int n = getPriority();
                          System.out.println(n);
                          sleep(2000);
                          System.out.println("睡了5秒钟");
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                  }
              }
          }
          
    • 创建多线程的方式之一--继承Thread类的方式

      class Treadtest extends Thread {
          private static int ticket = 100;
      
          @Override
          public void run() {
              for (int i = 0; i < 100; i++) {
                  if (ticket > 0) {
                      System.out.println("这是" + getName() + "卖的票" + " 票号 " + ticket--);
      
                  } else
                      break;
              }
          }
      }
      
      public class SellTicket {
          public static void main(String[] args) {
              Treadtest t1 = new Treadtest();
              Treadtest t2 = new Treadtest();
              Treadtest t3 = new Treadtest();
              t1.setName("窗口1:");
              t2.setName("窗口2:");
              t3.setName("窗口3:");
              t1.start();
              t2.start();
              t3.start();
          }
      }
      
      
    • 创建多线程的方式之二--实现了runnnable接口的类

      • 创建一个实现了runnnable接口的类

      • 实现类去实现runnable中的抽象方法 run()

      • 创建实现类的对象

      • 将此对象作为参数传递到Tread类的构造器当中,创建

        Tread类的对象。

      • 通过Thread类的对象调用start()

      class Mythread implements Runnable{
      //创建一个runnable的实现类
          @Override
          public void run() {
              for (int i = 0; i <100 ; i++) {
                 if (i % 2 == 0 ){
                     System.out.println(i);
                 }
              }
          }
      }
      public class Test {
          public static void main(String[] args) {
              //2.创造此实现类的对象
              Mythread mythread = new Mythread();
              //3.将此实现类的对象作为参数放到Thread类的构造器当中
              Thread t1 = new Thread(mythread);
              //4.调用start方法
              //4.1开始当前的线程
              //4.2调用当前线程的run
              //4.3Thread的构造方法的参数类型是runnable类型			的 正好在Thread当中声明的了一个
              //runnable类型的target变量,
              // 这时传入的实现了runnable接口的实现类的对象
              //正好使得target不为null 这时 当前的对象t1就调用mythread再调用run()方法
              
              t1.start();
          }
      }
      
      
    • 比较两种创建线程的方式

      • 优先选择Runnable接口的方式
      • 实现的方式没有类的单继承性的局限性
      • 更适合处理多个线程有共享数据的状况。
      • Thread类本身也实现了runnable接口
  • 相关阅读:
    Binder核心原理解析
    写给 Android 应用工程师的 Binder 原理剖析
    Android Binder原理解析
    Android面试题(25)-Bundle机制_pgg_cold的博客-CSDN博客_android bundle机制
    腾讯Android面试精选题——谈一谈Binder的原理和实现一次拷贝的流程
    把这份关于Android Binder原理一系列笔记研究完,进大厂是个“加分项”...
    大型项目必备IPC之其他IPC方式(二)
    骚年!用Binder原理去彻底征服Android大厂面试官吧
    还不懂Binder的原理?那么你即将损失一张腾讯的offer
    每日一问 Binder
  • 原文地址:https://www.cnblogs.com/wumingzhibei/p/12555095.html
Copyright © 2020-2023  润新知