javaSE21/10/1

多线程

线程创建方式三:实现Callable接口

  • 需要有返回值,要与重写的方法相同
  • 重写call方法,需要抛出异常
  • 创建目标对象
  • 创建执行服务:ExecutorService ser = Executors.newFixedThreadPool()
  • 提交执行:Future result1 = result1.get()
  • 获取结果:boolean r1 = result1.get()
  • 关闭服务:ser.shutdownNow()

静态代理

  • 线程的底部原理
  • 案例:结婚
    你:真是角色
    婚庆公司:代理你,帮你处理加魂的事
    结婚:需要实现的接口
public class Marry {
    public static void main(String[] args) {
        You you = new You();
        Wedding w = new Wedding(you);
        w.happyMarry();
    }
}
interface IMarry{
    void happyMarry();
}
class You implements IMarry{
    @Override
    public void happyMarry() {
        System.out.println("我结婚了");
    }
}
class Wedding implements IMarry{
    private IMarry target;

    public Wedding(IMarry target) {
        this.target = target;
    }

    @Override
    public void happyMarry() {
        befor();
        this.target.happyMarry();
        after();
    }
    public void befor(){
        System.out.println("布置现场");
    }
    public void after(){
        System.out.println("收尾款");
    }
}

Lamda表达式

  • 函数式接口:只包含唯一一个抽象方法的接口就是函数式接口
  • 我们可以通过lambda表达式来创建该接口的对象
public class TestLamda {
    static class Like2 implements ILike{//2.静态内部实现类
        @Override
        public void lambda() {
            System.out.println("Lambda2");
        }
    }
    public static void main(String[] args) {
        ILike l = new Like();
        l.lambda();//调用的是外部实现类
        l = new Like2();//对l进行再定义
        l.lambda();//调用的是静态内部实现类
        class Like3 implements ILike{//3.局部内部实现类
            @Override
            public void lambda() {
                System.out.println("Lambda3");
            }
        }
        l = new Like3();//再定义l
        l.lambda();//调用的是局部内部实现类
        //4.匿名内部类,没有类的名称,必须借助接口或者父类实现
        l = new ILike() {//new接口后直接重写方法
            @Override
            public void lambda() {
                System.out.println("Lambda4");
            }
        };
        l.lambda();
        //5.Lambda简化
        l = ()->{//写接口对象后直接写方法体,用->连接
            System.out.println("Lambda5");
        };
        l.lambda();
    }
}
//定义一个函数式接口
interface ILike{
    void lambda();
}
class Like implements ILike{//1.外部实现类
    @Override
    public void lambda() {
        System.out.println("Lambda");
    }
}
  • Lambda案例
public class TestLambda2 {
    public static void main(String[] args) {
        ILove i = (String s)->{//()内为重写方法时的参数
            System.out.println("Love"+s);
        };
        i.love("I love you");
        /*
        Lambda表达式简化:
        1.参数类型可以不写,括号也可以去掉但在多个参数时,要么都写参数类型,要么都不写,多个参数必须加括号
        2.在只有一行方法体时可以去掉花括号
         */
    }
}
interface ILove{
    void love(String s);
}

线程状态

线程停止

  • 测试stop
    1)建议线程正常停止,可以利用次数,不建议死循环
    2)建议使用标志位,设置一个标志位
    3)不要使用stop或者destroy等过时或JDK不建议书用的方法
public class TestStop implements Runnable{
    //设置一个标志位
    private boolean flog = true;
    @Override
    public void run() {
        int i = 0;
        while (flog){
            System.out.println("run----Thread"+i++);
        }
    }
    //设置一个公开的方法停止线程,转换标志位
    public void myStop(){
        this.flog = false;
    }

    public static void main(String[] args) {
        TestStop testStop = new TestStop();//创建一个线程对象
        new Thread(testStop).start();//开始线程
        for (int i = 0; i < 1000; i++) {
            System.out.println("main"+i);
            if (i==900){
                //调用start方法切换标志位,让线程停止
                testStop.myStop();
                System.out.println("线程停止了");
            }
        }
    }
}
posted @ 2021-10-01 17:55  想吃坚果  阅读(45)  评论(0)    收藏  举报