lambda表达式
(params) ->expression[表达式]
(params) ->statement[表达式]
(params) ->{statement}
为什么使用lambda表达式
-
避免匿名内部类定义过多
-
可以使代码更简洁
-
去掉一堆没有意义的代码,只留下最核心的逻辑
lambda表达:
package lineProxy;
public class TestLambda2 {
public static void main(String[] args) {
Iter iter =null;
//使用lambda表达式
iter = (int a)->{
System.out.println("lambda"+a);
};
//不建议简化
//只有在lambda表达式只有一行的情况下才可简化为一行即去掉{},如果有多行,那么就有{}代码块包裹。
//前提是接口是函数式接口(接口中只有一个函数)
//多个参数也可以去掉参数类型,参数类型相同,要去掉都去掉,必须加上()
//简化: 去参数类型,去(),去{}
iter = a -> System.out.println("lambda"+a);
iter.ite(20);
}
}
//先定义一个函数式接口
interface Iter{
void ite(int a);
}
lambda表达式与其他代码优化的比较:
package lineProxy;
/*
推导lambda表达式
*/
public class TestLambda {
//3.静态内部类
static class Like2 implements ILike{
@Override
public void lambda() {
System.out.println("lambda231");
}
}
public static void main(String[] args) {
Like like = new Like();
like.lambda();
Like2 like2 =new Like2();
like2.lambda();
//4.局部内部类
class Like3 implements ILike{
@Override
public void lambda() {
System.out.println("lambda3");
}
}
Like3 like3 = new Like3();
like3.lambda();
//5.匿名内部类
ILike iLike = new ILike() {
@Override
public void lambda() {
System.out.println("lambda4");
}
};
iLike.lambda();
//6.lambda简化
ILike iLike1 =()->{
System.out.println("lambda5");
};
iLike1.lambda();
}
}
//1.定义一个函数式接口
interface ILike{
void lambda();
}
//2.实现类
class Like implements ILike{
@Override
public void lambda() {
System.out.println("lambda");
}
}
线程状态![](https://img-blog.csdnimg.cn/77080dd3e08c41a3ac4271f84e609361.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5L-uMjQzNTI=,size_20,color_FFFFFF,t_70,g_se,x_16)
停止线程
-
不推荐使用JDK提供的stop()、destroy()方法。(已废弃)
-
推荐线程自我停止
-
或者使用一个标志位进行终止变量,例如当flag=false,则停止线程运行。
package state;
//测试stop
//1.建议线程正常停止,利用次数,不建议死循环
//2.建议使用标志位,设置一个标志
//3.不要使用stop或者destroy等已经过时的方法JDK不建议使用的方法
public class TestStop implements Runnable{
//设置一个标志
private boolean flag=true;
@Override
public void run() {
int i=0;
while (flag){
System.out.println("线程运行中"+ i++);
}
}
//设置一个方法停止线程,转换标志
public void stop(){
this.flag =false;
}
public static void main(String[] args) {
TestStop testStop = new TestStop();
new Thread(testStop).start();
for (int i = 0; i < 100; i++) {
if (i==90){
testStop.stop();
System.out.println("线程stop");
}
}
}
}
线程休眠_seelp
-
sleep(时间)指定当前线程阻塞的毫秒数
-
sleep存在异常InterruptedException
-
sleep时间达到后线程进入就绪状态
-
sleep可以模拟网络延时,倒计时等
-
每个对象都有一个锁,sleep不会释放锁
模拟网络延时
package state;
//模拟网络延时:放大问题的发生性
public class TestSleep implements Runnable{
//票的总数
private int ticketNums=10;
@Override//重写run
public void run() {
while (true){
if (ticketNums<=0){//设置为==0会有意外惊喜
break;
}
//模拟延时
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
//输出新建代理的 name 与票的数量 票数自减
System.out.println(Thread.currentThread().getName()+"拿到了"+ticketNums--);
}
}
public static void main(String[] args) {
TestSleep testSleep = new TestSleep();
//新建代理
new Thread(testSleep,"name1").start();
new Thread(testSleep,"name2").start();
new Thread(testSleep,"name3").start();
//多个线程操作同一个资源的情况之下,线程不安全,数据紊乱。
}
}
模拟倒计时与打印系统时间
package state;
import org.omg.CORBA.INTERNAL;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestSleep2 {
public static void main(String[] args) throws InterruptedException {
//tenDown();
//打印当前系统时间
Date date = new Date(System.currentTimeMillis());//打印当前系统时间
int i=0;
while (true){
i++;
Thread.sleep(1000);
System.out.println(new SimpleDateFormat("HH:mm:ss").format(date));
date =new Date(System.currentTimeMillis());//更新系统时间
if (i==10){
break;
}
}
}
//模拟倒计时
public static void tenDown() throws InterruptedException {
int ten=10;
while (true){
Thread.sleep(1000);
System.out.println(ten--);
if (ten==0){
break;
}
}
}
}
线程礼让_yield
-
礼让线程,让当前正在执行的线程暂停,但不阻塞
-
将线程从运行状态转为就绪状态
-
礼让后还是任cpu重新调度,所以礼让不一定成功。
package state;
//礼让不一定成功,看cpu心情
public class TestYield {
public static void main(String[] args) {
MyYield myYield = new MyYield();
new Thread(myYield,"xianc1").start();
new Thread(myYield,"xianc2").start();
}
}
class MyYield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"start");
Thread.yield();//设置礼让
System.out.println(Thread.currentThread().getName()+"stop");
}
}
礼让不一定成功,同一代码可能多次运行结果不同
线程强制执行_join
-
join合并线程,待此线程执行完成后,在执行其他线程,其他线程阻塞
package state;
//join可以理解为插队
public class TestJoin implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("插队执行join"+i);
}
}
public static void main(String[] args) throws InterruptedException {
TestJoin testJoin = new TestJoin();
Thread thread = new Thread(testJoin);
thread.start();
//主线程
for (int i = 0; i < 100; i++) {
if (i==50){
thread.join();
}
System.out.println("main"+i);
}
}
}