Lambda表达式
下面中的TestLambda是类名
引用静态方法 o->TestLambda.testObject(o) 也可以写成 TestLambda::testObject ;
引用对象方法 先创建对象;TestLambda testLambda = new TestLambda();
testLambda::testObject ;
//聚合操作方式遍历
objects
.stream()
.filter(o -> o.length > 5 && o.width < 4)
.forEach(o -> System.out.println(o.name));
//传统遍历
for (Object o : objects) {
if (o.length > 5 && o.width < 4)
System.out.println(o.name);
}
多线程
1.实现多线程的三个方法
1. 继承Thread类
2. 实现Runnable接口
3. 匿名类的方式
启动线程用start()方法
2.常用的方法:
Thread.sleep(1000); //当前线程暂停1S 需要抛出异常 InterruptedException
.join(); //比如:把t1线程t1.join()写入主线程中,主线程会等t1结束之后才开始继续往下走
Thread.MAX_PRIORITY
Thread.MIN_PRIORITY //线程优先级,最高10 最低1 默认5
Thread.NORM_PRIORITY
Thread.yield() //暂停线程
.setDaemon(); //守护线程
3.同步编程模型:t1线程和t2线程执行,当t1线程必须等t2线程执行结束之后,t1才开始执行。
引入线程同步机制,虽然会使应用程序使用率降低,但是保证了数据是安全的。
多线程的问题,又叫Concurrency 问题
4. 关键字: synchronized (共享对象){ 把需要同步的代码,放到同步语句块中 }
分为对象锁和类锁
StringBuffer的方法都是有synchronized修饰的,StringBuffer就叫做线程安全的类
而StringBuilder就不是线程安全的类
5. HashMap不是线程安全的类 HashMap可以存放 null
Hashtable是线程安全的类 Hashtable不能存放null
6. Collections.synchronizedList (); 用该方法可以将非线程安全的集合转换成线程安全的集合
7. 死锁
线程1先占用t1,然后想去占用t2 ;而线程2先占用t2,然后想去占用t1。
t1,t2都是使用了synchronized。这样就会形成死锁。
8. wait、notify和notifyAll (线程交互)
this.wait(); 存在于synchronized的语句块中,临时释放,并等待
this.notify(); 唤醒等待的线程
this.notifyAll(); 唤醒全部
9. 线程池
线程池类ThreadPoolExecutor 在包java.util.concurrent下
ThreadPoolExecutor threadPool= new ThreadPoolExecutor(10, 15, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
一共五个参数
10是初始化10个线程 如果不够用就自动增加最多到15个,