• 多线程详解1


    Thread

    创建线程方式1

    继承Thread类

    子类继承Thread类具备多线程能力

    启动线程:子类对象.start()

    不建议使用:避免OOP单继承局限性

    //创建线程方式1:继承Thread类,重写run()方法,调用start开启线程
    //线程开启不一定立即执行,由cpu调度
    public class TestThread1 extends Thread{
        @Override
        public void run() {
            //run方法线程体
            for (int i = 0; i < 20; i++) {
                System.out.println("我在看代码");
            }
        }
    
        public static void main(String[] args) {
            //main线程,主线程
            //创建一个线程对象
            TestThread1 testThread1 = new TestThread1();
            //调用start方法开启线程
            testThread1.start();
            for (int i = 0; i < 200; i++) {
                System.out.println("我在学习多线程");
            }
        }
    }

    网图下载

    //要导入commons-io
    import org.apache.commons.io.FileUtils;
    
    import java.io.File;
    import java.io.IOException;
    import java.net.URL;
    
    //练习Thread,实现多线程同步下载图片
    public class TestThread2 extends Thread{
        private String url;//网络图片地址
        private String name;//保存的文件名
    
        public TestThread2(String url, String name) {
            this.url = url;
            this.name = name;
        }
    
        @Override
        public void run() {//下载图片线程的执行体
            WebDownLoader webDownLoader = new WebDownLoader();
            webDownLoader.downLoader(url,name);
            System.out.println("下载了文件名为:"+name);
        }
    
        public static void main(String[] args) {
            TestThread2 t1= new TestThread2("https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=976577053,714354874&fm=26&gp=0.jpg","1.jpg");
            TestThread2 t2 = new TestThread2("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201810%2F05%2F20181005014913_uwpqy.jpg&refer=http%3A%2F%2Fb-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1624010560&t=062a7d0f6d5b657f0bbea623c03cfedb","2.jpg");
            TestThread2 t3= new TestThread2("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2F6de7e33bf1e0229c2822f33699cc885199dea90f.jpg&refer=http%3A%2F%2Fi0.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1624010639&t=97c19ba335a8e64a239509779fa240d0","3.jpg");
            t1.start();
            t2.start();
            t3.start();
        }
    }
    //下载器
    class WebDownLoader{
        //下载方法
        public void downLoader(String url,String name){
            try {
                FileUtils.copyURLToFile(new URL(url),new File(name));
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("IO异常,downloader方法出现异常");
            }
        }
    }
    //改成实现runnable接口
    import org.apache.commons.io.FileUtils;
    
    import java.io.File;
    import java.io.IOException;
    import java.net.URL;
    
    //练习Thread,实现多线程同步下载图片
    public class TestThread2 implements Runnable {
        private String url;//网络图片地址
        private String name;//保存的文件名
    
        public TestThread2(String url, String name) {
            this.url = url;
            this.name = name;
        }
    
        @Override
        public void run() {//下载图片线程的执行体
            WebDownLoader webDownLoader = new WebDownLoader();
            webDownLoader.downLoader(url,name);
            System.out.println("下载了文件名为:"+name);
        }
    
        public static void main(String[] args) {
            TestThread2 t1= new TestThread2("https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=976577053,714354874&fm=26&gp=0.jpg","1.jpg");
            TestThread2 t2 = new TestThread2("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201810%2F05%2F20181005014913_uwpqy.jpg&refer=http%3A%2F%2Fb-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1624010560&t=062a7d0f6d5b657f0bbea623c03cfedb","2.jpg");
            TestThread2 t3= new TestThread2("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2F6de7e33bf1e0229c2822f33699cc885199dea90f.jpg&refer=http%3A%2F%2Fi0.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1624010639&t=97c19ba335a8e64a239509779fa240d0","3.jpg");
            new Thread(t1).start();
            new Thread(t2).start();
            new Thread(t3).start();
        }
    }
    //下载器
    class WebDownLoader{
        //下载方法
        public void downLoader(String url,String name){
            try {
                FileUtils.copyURLToFile(new URL(url),new File(name));
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("IO异常,downloader方法出现异常");
            }
        }
    }

    创建线程方式2

    
    

    实现runnable接口

    
    

    实现接口Runnable具有多线程能力

    
    

    启动线程:传入目标对象+Thread对象.start()

    
    

    推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用

    //创建线程方式2:实现runnable接口,重写run方法,执行线程需要丢入runna接口实现类,调用start方法
    public class TestThread3 implements Runnable{
        @Override
        public void run() {
            for (int i = 0; i < 200; i++) {
                System.out.println("我在看代码");
            }
        }
    
        public static void main(String[] args) {
            //创建runnable接口的实现类对象
            TestThread3 testThread3 = new TestThread3();
            //创建线程对象,通过线程对象来开启我们的线程,代理
    //        Thread thread = new Thread(testThread3);
    //        thread.start();
            new Thread(testThread3).start();
            for (int i = 0; i < 200; i++) {
                System.out.println("我在学习多线程");
            }
        }
    
    
    }

    龟兔赛跑

    //模拟龟兔赛跑
    public class Race implements Runnable{
        private static String winner;
        @Override
        public void run() {
            for (int i = 0; i <=100; i++) {
                //模拟兔子休息
                if(Thread.currentThread().getName().equals("兔子")&&i%10==0){
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //判断比赛是否结束
                boolean flag = ganmeOver(i);
                //如果比赛结束了,就停止程序
                if(flag){
                    break;
                }
                System.out.println(Thread.currentThread().getName()+"-->跑了"+i+"步");
            }
        }
        //判断是否完成比赛
        private boolean ganmeOver(int steps){
            //判断是否有胜利者
            if(winner!=null){//已经存在胜利者了
                return true;
            }{
                if(steps>=100){
                    winner = Thread.currentThread().getName();
                    System.out.println("winner is"+winner);
                    return true;
                }
            }
            return false;
        }
    
        public static void main(String[] args) {
            Race race = new Race();
            new Thread(race,"兔子").start();
            new Thread(race,"乌龟").start();
        }
    }

    静态代理模式

    //静态代理模式总结:
    //真实对象和代理对象都要实现同一个接口
    //代理对象要代理真实角色
    //好处:代理对象可以做很多真实对象做不了的事
    //      真实对象专注做自己的事
    public class StaticProxy {
        public static void main(String[] args) {
            WeddingCompany weddingCompany = new WeddingCompany(new You());
            weddingCompany.HappyMarry();
        }
    }
        interface Marry{
            void HappyMarry();
        }
        //真实角色,你去结婚
        class You implements Marry{
    
            @Override
            public void HappyMarry() {
                System.out.println("要结婚了,超开心");
            }
        }
        //代理角色,帮助你结婚
        class WeddingCompany implements Marry{
            private Marry target;
    
            public WeddingCompany(Marry target) {
                this.target = target;
            }
    
            @Override
            public void HappyMarry() {
                before();
                this.target.HappyMarry();
                after();
            }
    
            private void after() {
                System.out.println("结婚之后收尾款");
            }
    
            private void before() {
                System.out.println("结婚前布置现场");
            }
        }
    
    

    Lambda表达式

    //推导lambda表达式
    public class TestLambda1 {
        //静态内部类
        static class Like2 implements ILike{
            @Override
            public void lambda() {
                System.out.println("i like lambda2");
            }
        }
    
        public static void main(String[] args) {
            ILike like = new Like();
            like.lambda();
            like = new Like2();
            like.lambda();
            //局部内部类
            class Like3 implements ILike{
                @Override
                public void lambda() {
                    System.out.println("i like lambda3");
                }
            }
           like = new Like3();
           like.lambda();
    
            //匿名内部类,没有类的名称,必须借助接口或者父类
            like = new ILike() {
                @Override
                public void lambda() {
                    System.out.println("i like lambda4");
                }
            };
            like.lambda();
    
            //用lambda简化
            like = () ->{
                System.out.println("i like lambda5");
            };
            like.lambda();
        }
    }
    //定义一个函数是接口
    interface ILike{
        void lambda();
    }
    //实现类
    class Like implements ILike{
        @Override
        public void lambda() {
            System.out.println("i like lambda");
        }
    }
    public class TestLambda2 {
    
        public static void main(String[] args) {
            //lambda表达式简化
            ILove love =(int a)-> {
                System.out.println("I love you-->"+a);
            };
            //简化1.去掉参数值的类型
            love = (a)-> {
                System.out.println("I love you-->"+a);
            };
            //简化2.简化括号
            love = a-> {
                System.out.println("I love you-->"+a);
            };
            //简化3.去掉花括号
            love  = a->System.out.println("I love you-->"+a);
            //总结:
            //lambda表达式只能有一行代码的情况下才能简化成一行,如果有多行,那么就用代码块包裹
            //前提是接口为函数式接口
            //多个参数也可以去掉参数类型,要去掉就都去掉,必须加上括号
            love.love(2);
        }
    }
    interface ILove{
        void love(int a);
    }
     
  • 相关阅读:
    小程序动态添加input(一)
    vue样式穿透
    小程序判断用户是否授权位置信息
    【超详细】MySQL学习笔记汇总(四)之排序查询
    【超详细】MySQL学习笔记汇总(三)之进阶1、2测试
    【超详细】MySQL学习笔记汇总(二)之条件查询
    【超详细】MySQL学习笔记汇总(一)之基础查询
    【超详细】MakeDown(Typora)+PicGo+Gitee实现图床
    JavaDOC生成文档
    学习Hive遇到的问题
  • 原文地址:https://www.cnblogs.com/asako/p/14787417.html
Copyright © 2020-2023  润新知