Lamda表达式、线程停止,休眠,礼让(yield),join,优先级,守护(daemon)、同步、Lock、线程池

 

Lamda表达式

 

(1)Functional Interface(函数式接口)

(2)函数式接口定义:(即接口只有一个方法)

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

·对于函数式接口,可以通过Lamda表达式创建函数式接口的对象

 

范例:(外部类)

package proxy;
// 接口
interface Ilike{
   public void lambda();
}
// 1、外部类
class Like1 implements Ilike{
   @Override
   public void lambda() {
       System.out.println("外部类");
  }
}
public class StaticProxy{
   public static void main(String[] args) {
       Like1 like1=new Like1();  //外部类
       like1.lambda(); //外部类
  }
}

 

范例:(静态内部类)

package proxy;
// 接口
interface Ilike{
   public void lambda();
}

public class StaticProxy{
   // 2、静态内部类
   static class Like1 implements Ilike{
       @Override
       public void lambda() {
           System.out.println("静态内部类");
      }
  }
   public static void main(String[] args) {
       Like1 like1=new Like1();  //静态内部类
       like1.lambda();//静态内部类
  }
}

 

范例:(局部内部类)

package proxy;
// 接口
interface Ilike{
   public void lambda();
}

public class StaticProxy{

   public static void main(String[] args) {
       // 2、局部内部类
       class Like1 implements Ilike{
           @Override
           public void lambda() {
               System.out.println("局部内部类");
          }
      }

       Like1 like1=new Like1();  //局部内部类
       like1.lambda();//局部内部类
  }
}

 

范例:(匿名内部类)

package proxy;
// 接口
interface Ilike{
   public void lambda();
}

public class StaticProxy{

   public static void main(String[] args) {

       Ilike like1=new Ilike() {
           @Override
           public void lambda() {
               System.out.println("匿名内部类");
          }
      };
       like1.lambda();  //匿名内部类
  }
}

 

范例:(Lamda表达式)---无参

package proxy;
// 接口
interface Ilike{
   public void lambda();
}
public class StaticProxy{
   public static void main(String[] args) {

       Ilike like=()->{
               System.out.println("Lamda表达式");
      };
       like.lambda();  //Lamda表达式
  }
}

 

范例:(Lamda表达式)---有参

package proxy;
// 接口
interface Ilike{
   public void lambda(int a);
}

public class StaticProxy{

   public static void main(String[] args) {

       Ilike like=(int a)->{
           System.out.println("Lamda表达式"+a);
      };
       like.lambda(10);  //Lamda表达式 10
  }
}

 

线程停止

(1)建议线程正常停止----->利用次数

(2)建议使用标志位---->设置一个标志位(true/false)

(3)不要用stop或者destroy等过时或JDK不建议用的方法

 

线程方法

方法 说明
setPriority(int newPriority) 更改线程的优先级
static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠
void join() 等待该线程终止
static void yield() 暂停当前正在执行的线程对象,并执行其他线程
void interrupt() 中断线程,不建议使用
boolean isAlive() 测试线程是否处于活动状态

 

范例:(停止线程)

package collection;

public class Demo4 implements Runnable{
   private  boolean flag=true;
   @Override
   public void run() {
       while (flag) {
           System.out.println("输出");
      }
  }

   public void stop(){
       this.flag=false;
  }
   public static void main(String[] args) {
       Demo4 d4=new Demo4();
       new Thread(d4).start();

       for (int i = 0; i <50 ; i++) {
           System.out.println("main"+i +"   ");
           if(i==30){
               d4.stop();
               System.out.println("线程停止了");
          }
      }
  }
}

 

线程休眠

(1)sleep存在异常InterruptedException

(2)sleep可以模拟网络延时,倒计时等

(3)每个对象都有一个锁,sleep不会释放锁

 

范例:(模拟倒计时)
package collection;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo5 {
   public static void main(String[] args) throws InterruptedException {
       Date date=new Date(System.currentTimeMillis());  
// 获取当前系统的时间
       while (true){
           Thread.sleep(1000);  // 延时1秒
           System.out.println(new SimpleDateFormat("HH:mm:ss").format(date));
           date=new Date(System.currentTimeMillis());  
//(重新获取) 更新当前系统的时间
      }
  }
}

 

线程礼让yield

(1)线程礼让,即让当前正在执行的线程暂停,但不阻塞

(2)将线程从运行状态转为就绪状态

(3)让cpu重新调度,礼让不一定成功,看cpu心情

package collection;
class MyYield implements Runnable{

   @Override
   public void run() {
       System.out.println(Thread.currentThread().getName()+"开始");
       Thread.yield();  //礼让
       System.out.println(Thread.currentThread().getName()+"停止");
  }
}

public class Demo6 {
   public static void main(String[] args) {
       MyYield my=new MyYield();

       new Thread(my,"a").start();
       new Thread(my,"b").start();
/*
       不礼让,则开始-结束为一对出现
       a开始
       a停止
       b开始
       b停止
*/
/*
       礼让,则开始-结束不为一对出现(也可能一对出现,可能礼让不成功)
       a开始
       a停止
       b开始
       b停止
*/
  }
}

 

join

(1)join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞(可以理解为插队)

package collection;
public class Demo7 implements Runnable {
   @Override
   public void run() {
       for (int i = 0; i < 90; i++) {
           System.out.println("线程vip来了");
      }
  }

   public static void main(String[] args) throws InterruptedException {
       // 启动线程
       Demo7 d7=new Demo7();
       Thread thread=new Thread(d7);
       thread.start();

       // 主线程
       for (int i = 0; i < 100; i++) {
           if (i==90){
               thread.join();  // 插队
          }
           System.out.println("main"+i);
      }
  }
}

 

线程中断或结束,一旦进行死亡状态,就不能再次启动

 

线程优先级

(1)线程的优先级用数字表示,范围1-10,大则优先级高

(2)设置优先级:setPriority(),获取优先级:getPriority()

(3)优先级的设置要在start()调度前

(4)优先级低只是意味着获得调度的概率低,并不是优先级低就不会被调用

 

范例:(设置优先级)
package collection;
public class Demo7 implements Runnable {
   @Override
   public void run() {
       System.out.println("Thread "+Thread.currentThread().getName()+"----->"+Thread.currentThread().getPriority());
  }
   public static void main(String[] args) throws InterruptedException {
       Demo7 d1=new Demo7();
       Thread t1=new Thread(d1,"t1");
       Thread t2=new Thread(d1,"t2");
       Thread t3=new Thread(d1,"t3");
       Thread t4=new Thread(d1,"t4");
       t1.setPriority(1);  // 设置优先级
       t1 .start();  // 启动线程
       t2.setPriority(4);  // 设置优先级
       t2 .start();
       t3.setPriority(7);  // 设置优先级
       t3 .start();
       t4.setPriority(10);  // 设置优先级
       t4 .start();
       // 主线程,默认优先级
       System.out.println("main线程");
  }
}

 

守护(daemon)线程

(1)线程分为用户线程和守护线程

(2)虚拟机必须确保用户线程执行完毕

(3)虚拟不有等待守护线程执行完毕

范例:(守护线程)
package collection;

public class TextDaemon {
   public static void main(String[] args) {
       God god=new God();
       You you=new You();
       Thread thread=new Thread(god);
       //设置守护线程,setDaemon()默认为false,正常的线程是用户线程,
       thread.setDaemon(true);
       thread.start();

       new Thread(you).start();
  }
}
// 上帝
class God implements Runnable{
   @Override
   public void run() {
       while(true){
           System.out.println("上帝一直守护着你");
      }
  }
}
// 你
class You implements Runnable{
   @Override
   public void run() {
       for (int i = 0; i < 3650; i++) {
           System.out.println("你活了"+i+"天");
      }
       System.out.println("====================Godbye==================");
  }
}

 

线程同步

多个线程操作同一个资源 并发:同一个对象被多个线程同时操作

范例:(同步方法)
package collection;

public class Demo10 {
   public static void main(String[] args) {
       LLock ck=new LLock();
       new Thread(ck).start();
       new Thread(ck).start();
       new Thread(ck).start();
  }
}

class LLock implements Runnable{
   private int licket=10;

   @Override
   public synchronized void run() {
       while (true){
           if (licket>0){
               try {
                   Thread.sleep(100);
              } catch (InterruptedException e) {
                   e.printStackTrace();
              }
               System.out.println(licket--);
          }else {
               break;
          }
      }

  }
}

 

 

Lock(锁)

(1)使用ReentrantLock类实现Lock,可以显式加锁、解放锁

ReentrantLock可重用锁

 

synchronized与Lock

synchronized lock
隐式锁(出了作用域自动释放) 显式锁(手动开启和关闭锁)
有代码锁和方法锁 只有代码锁

 

优先使用顺序:

Lock > 同步代码块(已经进入了方法体,分配了相应资源) > 同步方法(在方法体之外)

 

范例:(同步代码块)
package collection;
import java.util.concurrent.locks.ReentrantLock;
public class Demo10 {
   public static void main(String[] args) {
       LLock ck=new LLock();
       new Thread(ck).start();
       new Thread(ck).start();
       new Thread(ck).start();
  }
}

class LLock implements Runnable{
   private int licket=10;
   // 定义lock 锁
   private final ReentrantLock lock=new ReentrantLock();

   @Override
   public void run() {
       while (true){
           try{
               lock.lock(); // 加锁
               if (licket>0) {
                   try {
                       Thread.sleep(100);
                  } catch (InterruptedException e) {
                       e.printStackTrace();
                  }
                   System.out.println(licket--);
              }else{
                   break;
              }
          }finally {
               lock.unlock();  // 解锁
          }
      }
  }
}

 

 

范例:(同步)---生产者消费者模型
package text;
public class Text {

public static void main(String[] args) {
M m=new M();
new P(m).start();
new C(m).start();
}
}

// 演员
class P extends Thread{
   private M m;
   public P(M m){
      this.m=m;
  }
   @Override
   public void run() {
       for (int i = 0; i < 20; i++) {
           if(i%2==0){
               this.m.play("aaa");
          }else {
               this.m.play("bbb");
          }
      }
  }
}

// 观众
class C extends Thread{
   private M m;
   public C(M m){
       this.m=m;
  }
   @Override
   public void run() {
       for (int i = 0; i < 20; i++) {
           this.m.watcher();
      }
  }
}

// 节目
class M{
   private String name;
   boolean flag=true;

   public synchronized void play(String name){
       if(!flag){
           try {
               this.wait();
          } catch (InterruptedException e) {
               e.printStackTrace();
          }
      }
       System.out.println("========表演"+name);
       // 通知欢众观看
       this.notify();
       this.name=name;
       this.flag=!this.flag;
  }

   public synchronized void watcher(){
       if (flag){
           try {
               this.wait();
          } catch (InterruptedException e) {
               e.printStackTrace();
          }
      }
       System.out.println("观看"+name);
       // 通知演员表演
       this.notify();
       this.flag=!this.flag;
  }
}

 

线程池

(1)真正线程池接口:ExecutorService。常见子类ThreadPoolExecutor

(2)Executors:工具类、线程池的工厂类,用于创建并返回不同类型的线程池

 

// 创建服务,创建线程池,newFixedThreadPool , 参数为:线程池大小

ExecutorService service=Executors.newFixedThreadPool(10);

 

范例:
package text;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Text1 {
public static void main(String[] args) {
// 创建服务,创建线程池,newFixedThreadPool , 参数为:线程池大小
ExecutorService service=Executors.newFixedThreadPool(10);

// 执行
service.execute(new MyThread());
service.execute(new MyThread());
service.execute(new MyThread());
service.execute(new MyThread());

// 关闭链接
service.shutdown();

// pool-1-thread-1
// pool-1-thread-2
// pool-1-thread-3
// pool-1-thread-4
}
}

class MyThread implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

上一篇:iOS开发——数据持久化&本地数据的存储(使用NSCoder将对象保存到.plist文件)


下一篇:Docker存储卷