1. 线程间通信:多线程工作时,需要对同一数据进行操作,避免对同一共享变量争夺,通过等待唤醒机制,有效利用资源;
2.等待与唤醒机制:wait:线程不在活动,不参与带哦度,进入wait set中;
notify:选取所统治对象的wait set中的一个线程释放;
nofityAll:释放所统治对象的wait set上全部线程;
wait和notify对同一个锁对象调用;同属于Object类;必须在同步代码块或者同步函数中使用;
分析:
3.线程池:1>并发的线程数量多,同时每个线程在很短的时间内就结束;
引入一个方法,是执行完一个任务不被销毁,可以执行其他任务,是容纳多个线程的容器;
2>线程池容器:(一个集合)ArrayList,HashSet,LinkedList<Thread>,HashMap
3>原理:当序第一次启动的时候,创建多个线程到一个集合中,当想要使用多个线程的时候,从集合中取出使用;
//Thread t = list.remove(0);返回被移除元素(线程只能被一个任务使用)
//Thread t = linked.removeFist();
使用线程结束后,需要把线程归还到线程池;
//list.add(t);
//list.addLast(t);
4>使用步骤:<1>使用线程池工厂类Excutors里面的静态方法newFixedThreadPool生产指定线程数量的线程池;
<2>创建一个类,实现Runable接口,重写run方法,设置线程任务;
<3>调用ExecutorService中的方法submit,传递线程任务(实现类),开启线程,执行run方法;
<4>调用ExecutorService中的方法shutdown销毁线程池(?不建议使用)
4. 1>匿名内部类:好处:不用定义一个内部类来实现接口;弊端:语法复杂;
2>Lambda表达式:<1>()-> System.out.println("多线程任务执行!")
//():Lambda的参数列表;
// ->:将前面的参数传递给后面的逻辑代码;
<2>凡事可以根据上下文推导出来的,可以省略不写
(参数列表)括号中参数列表的数据类型,可省略 / 括号中的参数只有一个,类型和()可省略;
(一些代码)若{}中的代码只有一行,无论是否有返回值,都可以省略({},return,;)必须同时省略;
<3>使用前提:必须有接口,同时接口有且只有一个抽象方法;
方法的参数或局部变量类型必须是Lambda对应的接口类型,Lambda才可当接口实例。