多线程

多线程

创建线程的两种方式

1.继承Thread类,重写它的run方法;

2.实现Runnable接口,重写它的run方法;

线程状态

延时睡眠

sleep(延时)使线程休眠不会释放锁

线程终止

定义一个标志位flag=false,不推荐使用stop(),destroy()方法

线程强制执行

join,可以想象成插队,等此线程执行完后,再执行其他线程,否则其他线程堵塞

线程通信(不同线程之间的消息传递)

wait(),notify()两个方法在一起使用

wait() 使线程处于等待状态(可加参数,设置等待豪秒数),会释放锁,

notyfy唤醒一个等待的线程,notifyall唤醒同一个对象上所有调用wait()方法的线

线程礼让

yield(),现有a,b两个线程,a先进入cpu执行,a调用yield(a从cpu中出来),使线程a处于就绪状态,然后cpu再随机调度其中一个线程

线程安全

加锁的两种方式:

synchronizey(隐式锁),lock(显示锁)

区别:

synchronizey可以作用在方法和代码块(参数)上,lock lock只能作用在代码块 lock.lock加锁 lock.unlock释放锁

死锁

某一同步块拥有两个以上对象的锁时,可能发生死锁

处理方法:

避免两条线程同时拥有一个锁

线程池

两个相关api :Executors(线程池工具类) ExecutorService(线程池接口),通过这两个api创建线程池,设置线程池大小, 用execute方法把线程放入线程池,用完要用shutdown方法结束线程池

lamda表达式

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

对于函数式接口我们就可以使用lamda表达式创建该接口对象

lamda表达式简化过程
package com.yang;

public class TestLamda {
   //3.静态内部类
   static class Love2 implements Ilove{

       public void lamda() {
           System.out.println("i like lamda2");
      }
  }
   public static void main(String[] args) {
       Ilove love = new Love();
       love.lamda();

       love = new Love2();
       love.lamda();
       //4.局部内部类
        class Love3 implements Ilove{
           public void lamda() {
               System.out.println("i like lamda3");
          }
      }
       love = new Love3();
       love.lamda();

       //5.匿名内部类,没有类名,必须借助接口实现
       love = new Love(){
           public void lamda() {
               System.out.println("i like lamda4");
          }
      };
       love.lamda();

       //6.lamda,jdk1.8新特性
       love=()->{
               System.out.println("i like lamda5");
      };
       love.lamda();

  }
}
//定义一个函数试接口
interface Ilove{
   void lamda();
}
//实现类
class Love implements Ilove{

   public void lamda() {
       System.out.println("i like lamda");
  }
}

 

posted @ 2020-07-30 00:57  ㊀觉睡到小时候  阅读(62)  评论(0)    收藏  举报