Java学习笔记(9)

谁都会走 提交于 2020-03-03 11:45:20

等待唤醒机制

应用场景主要是多线程需要共同完成一个事情,比如写一个服务插件,线程A需要服务器传过来的数据,而接收服务器的data是线程B的工作,这时候就可以使用线程间通信,data作为资源类,当没有data时,线程A处于wait状态,线程B处于运行状态,当线程B接收到data时,唤醒线程A

线程B示例

@Override
public void run() {
    while(true){
        synchronized (data){
            //如果有数据了
            if(data.flag == true){
                try {
                    //线程B等待
                    thread_B.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //服务器获取数据 略
            //。。。。。。

            //获取到数据修改标志位
            data.flag=true;

            //唤醒线程A开始处理数据
            thread_A.notify();
        }
    }
}

需要注意的是,即使将一个线程唤醒,这个线程也不一定就能立马运行,因为被唤醒的线程还要经历和其他运行的线程抢“锁”的过程,如果能抢到就开始运行,抢不到就从等待变成被锁的状态
另外,线程间通信,操作的应该是同一个对象,同一个资源
常用的函数

wait()
notify()
notifyAll()//可以唤醒所有线程

线程池

线程池是一个管理线程的容器,省去了创建和销毁线程,减少内存消耗和资源消耗

使用Executors 创建线程池

public static void main(String[] args) {
    //创建线程池 可以设置有几个线程
    ExecutorService threadPool = Executors.newFixedThreadPool(3);

    //创建线程对象
    run thread_1 = new run();
    run2 thread_2 = new run2();

    //调用线程中的run方法
    threadPool.submit(thread_1);
    threadPool.submit(thread_2);
    threadPool.submit(thread_1);
    
    //调用完后  线程归还线程池
}

在这里插入图片描述

λ表达式

比较注重结果

标准格式:

(参数类型 参数名称) -> { 代码 }

箭头表示传参

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!