等待与唤醒 线程池 Lambda表达式

等待唤醒机制就是用于解决线程间通信的问题的,使用到的3个方法的含义如下:
1. wait:线程不再活动,不再参与调度,进入 wait set 中,因此不会浪费 CPU 资源,也不会去竞争锁了,这时的线程状态WAITING。它还要等着别的线程执行一个特别的动作,也即是“通知(notify)”在这个对象上等待的线程从wait set 中释放出来,重新入到调度队列(ready queue)中
2. notify:则选取所通知对象的 wait set 中的一个线程释放;例如,餐馆有空位置后,等候就餐最久的顾客最先入座
3. notifyAll:则释放所通知对象的 wait set 上的全部线程

总结:
如果能获取锁,线程就从 WAITING 状态变成 RUNNABLE 状态;
否则,从 wait set 出来,又进入 entry set,线程就从 WAITING 状态又变成 BLOCKED 状态

目录

线程池

Lambda表达式


线程池

JDK1.5之后提供的

java.util.concurrent.Executor :线程池的工厂类,用来生成线程池

Executor类中的静态方法:

public static ExecutorService newFixedThreadPool(int nThreads) :返回线程池对象。(创建的是有界线程池,也就是池中的线程个数可以指定最大数量)

参数:

       int  nThreads    创建线程池中包含的线程数量

返回值:

       ExecutroService接口,返回的是ExecutorService接口的实现类对象,我们可以使用ExecutorService接口接收(面向接口编程)

java.util.concurrent.ExecutorService:线程池接口

       用来从线程池中获取线程,调用start方法,执行线程任务

            submit(Runnable task) 提交一个Runnable 任务用于执行

       关闭/销毁线程池的方法:

             void shutdown( )

 线程池使用步骤:

    1. 使用线程池的工厂类Executors里面提供的静态方法newFixedThreadPool生成一个指定线程数量的线程池
    2. 创建一个类,实现Runnable接口,重写run方法,设置线程任务
    3. 调用ExecutorService中的方法submit,传递线程任务(实现类),开启线程,执行run方法
    4. 调用ExecutorService中的方法shutdown销毁线程池 (不建议执行)

代码:

            Runnable实现类

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("我要一个教练");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("教练来了: " + Thread.currentThread().getName());
        System.out.println("教我游泳,交完后,教练回到了游泳池");
   

              线程池测试类

public class ThreadPoolDemo {
    public static void main(String[] args) {
        // 创建线程池对象
        ExecutorService service = Executors.newFixedThreadPool(2);//包含2个线程对象
        // 创建Runnable实例对象
        MyRunnable r = new MyRunnable();
        //自己创建线程对象的方式
        // Thread t = new Thread(r);
        // t.start(); ‐‐‐> 调用MyRunnable中的run()
        // 从线程池中获取线程对象,然后调用MyRunnable中的run()
        service.submit(r);
        // 再获取个线程对象,调用MyRunnable中的run()
        service.submit(r);
        service.submit(r);
        // 注意:submit方法调用结束后,程序并不终止,是因为线程池控制了线程的关闭。
        // 将使用完的线程又归还到了线程池中
        // 关闭线程池
        //service.shutdown();
    }
}

ps.线程池会一直开启,使用完了线程,会自动把线程归还给线程池,线程可以继续使用

 

Lambda表达式

面向对象的思想:

       做一件事,找一个能解决这个事情的对象,调用对象的方法,完成

函数式编程思想:

       只要能获取到结果,谁去做、怎么做都不重要,重视的是结果,不重视过程

 

Lambda表达式格式由3个部分组成:
一些参数、一个箭头、一段代码

Lambda表达式的标准格式为:(参数类型 参数名称) ‐> { 代码语句 }

解释说明格式:

     ( ):接口中抽象方法的参数列表,没有参数就空着;有参数就写出参数,多个参数使用逗号分隔

     ->:传递的意思,把参数传递给方法体()  

     { }:重写接口的抽象方法的方法体

 

Lambda表达式:是可推导,可省略的

凡是根据上下文推导出来的东西,都可以书写

可以省略的内容:

    1.(参数列表):括号中参数列表的数据类型,可以省略不写

    2.(参数列表):括号中的参数如果只有一个,那么类型和()都可以省略

    3.(一些代码):如果{}中的代码只有一行,无论是否有返回值,都可以省略( {},return,分号)

             注意:要省略{},return,分号必须一起省略

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值