多线程部分笔记

Posted 代码小天才阿松

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程部分笔记相关的知识,希望对你有一定的参考价值。

基本概念

多任务:

同时干多件事情,例如:吃饭玩儿手机,上厕所玩儿手机

多线程:

原来是单车道,但是车越来越多了 所以拓宽了到了 变成了多车道 ,不会出现拥堵的情况

image-20210517085932226

进程

在操作系统中运行的程序就是进程 ,音乐 视频等.是系统资源分配的单位

线程

看电视时同时进行的声音,字幕,图像等就是线程,CPU调度和执行的单位

核心概念

image-20210517090439816

 

线程创建

三种实现方式

  • Thread class 继承Thread类(重点)

  • Runnable接口 实现Runnable接口(重点)

  • Callable接口 实现Callbale接口(了解)

Thread

  • 自定义想线程类继承Thread类

  • 重写Run()方法,编写线程执行体

  • 创建对象,调用.start()方法启动线程,调用.start()方法是同时执行,都是随机的CPU说了算, .run()是先跑自定义线程类内的

注意:线程开启不一定立即执行,由CPU调度

Runnable接口

实现Runnable接口,重写run方法,执行线程需要丢入Runnable接口实现类,调用.start()方法

与Thread对比:image-20210517095526503

Callable接口

  • 实现Callable接口

  • 重写call方法

  • 创建执行服务 -->提交执行 - ->获取结果 - - >关闭服务ser.shutdownNow()

好处:可以定义返回值,可以抛出异常

龟兔赛跑案例

public class Race implements Runnable{
   //胜利者
   private static  String winner;
   @Override
   public void run() {
       for (int i = 0; i <= 100; i++) {
           //模拟兔子睡觉
           if (Thread.currentThread().getName().equals("兔子")&&i%10==0){
               try {
                   Thread.sleep(1);
              } catch (InterruptedException e) {
                   e.printStackTrace();
              }
          }
           //判断比赛是否结束
           boolean falg  = gameover(i);
           //如果比赛结束了,就终止程序
           if(falg==true){
               break;
          }

           System.out.println(Thread.currentThread().getName()+"-->跑了"+i+"米");
      }
  }
   //判断是否完成比赛
   private boolean gameover(int steps){
//判断是否有胜利者
       if(winner!=null){//已经存在胜利者了
               return true;
      }{
           if(steps>=100){
               winner = Thread.currentThread().getName();
               System.out.println("winner is "+ winner);
               return true;
          }
      }
       return false;
  }

   public static void main(String[] args) {
       Race race = new Race();
       new Thread(race,"兔子").start();
       new Thread(race,"乌龟").start();
  }
}

静态代理

  • 真实对象跟代理对象都要实现同一个接口

  • 代理对象代理真实角色

好处:

  • 代理对象可以做很多真实对象做不了的事儿

  • 真实对象专注做自己的事儿

 

λ表达式

概念:

  • 避免匿名内部类定义过多

  • 其实质属于函数式编程

为什么要用λ表达式

  • 避免匿名内部类定义过多

  • 让代码看起来更简洁

  • 去掉一堆没意义的代码,只留下核心逻辑

函数式接口

任何接口,如果只包含唯一一个抽象方法,那他就是一个函数式接口

 

 

 

 

 

 

 

 

 

以上是关于多线程部分笔记的主要内容,如果未能解决你的问题,请参考以下文章

多线程部分笔记

多线程 Thread 线程同步 synchronized

多线程

多个用户访问同一段代码

线程学习知识点总结

多个请求是多线程吗