Day10 callable的使用,lambda表达式
Day10
多线程
callable
callable使用方法整体和Thread的使用方法类似,需要子类继承callable接口,并且重写call方法而不再是run方法。
而在实例时,Thread可以直接用start方法启动
callable则需要用四步来完成,
//创建执行服务
ExecutorService ser= Executors.newFixedThreadPool(3);
//提交执行
Future<Boolean> result1=ser.submit(demo01);
Future<Boolean> result2=ser.submit(demo02);
Future<Boolean> result3=ser.submit(demo03);
//获取结果
boolean r1=result1.get();
boolean r2=result2.get();
boolean r3=result3.get();
System.out.println(r1);
System.out.println(r2);
System.out.println(r3);
//关闭服务
ser.shutdown();
很明显这是用一个线程池来完成,和以前python写爬虫用到的多线程也是用线程池来写的。
Callable的好处
- 可以定义返回值
- 可以跑出异常
静态代理模式
public class StaticProxy {
public static void main(String[] args) {
ProxyMarry proxyMarry = new ProxyMarry(new Me());
proxyMarry.HappyMarry();
}
}
interface Marry{
void HappyMarry();
}
class Me implements Marry{
@Override
public void HappyMarry() {
System.out.println("。。。结婚中。。。");
}
}
class ProxyMarry implements Marry
{
Marry target;
public ProxyMarry(Marry target) {
this.target = target;
}
@Override
public void HappyMarry() {
before();
target.HappyMarry();
after();
}
private void after() {
System.out.println("。。。结婚后。。。");
}
private void before() {
System.out.println("。。。结婚前。。。");
}
}
真实对象和目标代理对象都要实现同一个接口,代理对象要代理真实角色。
代理对象可以做很多真实对象做不了的事。
真实对象就可以专注做自己的事情。
new Thread(()->System.out.println("我爱你")).start();
静态代理就是Thread, 比如上图的代理公司。
Lambda表达式
是为了简化代码,上面的就是lambda表达式的方式 属于函数式编程
避免匿名内部类定义过多,可以让代码变的更简洁,去掉了没有意义的代码,只留核心的逻辑。
函数式接口
内部只有一个抽象方法,两个方法就不是函数式接口。
而有函数式接口,就能用lambda表达式创建对象。
静态内部类只需要在前面加一个static即可
局部内部类放到方法里面
匿名内部类,没有类的名称,借助接口或者父类来完成
lambda表示化简
lambda表达式化简所以
like=()->{System.out.println(" lambda")};
化简的是函数式接口的表达。
然后再调用这个接口的函数即可
(参数)->{代码块};//不写方法名和继承类名
简化后,括号,花括号,参数类型都可以不写
a->代码;就是lambda表达式。花括号不写的前提是只有一个语句,而如果代码块有很多条语句就需要加上花括号。
多个参数也可以去掉参数类型,如果去掉,所有都要去掉。 但是必须要加括号。
而正好Runnable接口只有一个方法,就是run方法,可以用lambda方法来表示。
线程的五大状态
创建 就绪 阻塞 运行 死亡 五大状态。
线程停止
线程停止建议线程正常停止->利用次数,不建议使用死循环
建议使用标志位
不要使用stop和destroy等过时的方法。
通过一个自己写的方法来使线程终止。
思考
今天学习多线程的callable操作是利用线程池的方法来启动的,其他都和Thread类似,方法则是call,以及静态代理模式用来Thread。
和lambda表达式,来快捷化简的表达函数式接口的一个方法。以及线程停止,我最开始用的线程停止是用interrupt方法,由于不知道,所以应该选择更安全的方法来使线程停止。