等待唤醒机制
应用场景主要是多线程需要共同完成一个事情,比如写一个服务插件,线程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);
//调用完后 线程归还线程池
}

λ表达式
比较注重结果
标准格式:
(参数类型 参数名称) -> { 代码 }
箭头表示传参
来源:CSDN
作者:z_haha
链接:https://blog.csdn.net/z_haha/article/details/104622261