zoukankan      html  css  js  c++  java
  • 多线程详解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);
    }
     
  • 相关阅读:
    Atitit 经济学常见的流派 古典主义与凯恩斯主义
    Atitit 学习方法 体系化学习方法 Excel 科目,分类,专业 三级分类。。 知识点。。 课程就是每一个知识点的详细化。。 比如经济学 类别 专业 xx概论知识点 3、金
    atiitt it学科体系化 体系树与知识点概念大总结.xlsx
    Atitit 减少财政支出普通人如何蹭政府补贴措施 attilax大总结.docx
    Atitit 信用管理概论 attilax学习心得
    Atitit.月度计划日程表 每月流程表v5
    Atitit 企业6大职能 attilax总结
    Atitit 常见每日流程日程日常工作.docx v8 ver ampm imp 签到 am y 天气情况检查 am y 晨会,每天或者隔天 am 每日计划(项目计划,日计划等。 am
    Atitit 财政赤字解决方案
    Atitit 建设自己的财政体系 attilax总结 1.1. 收入理论 2 1.2. 收入分类 2 1.3. 2 1.4. 非货币收入 2 1.5. 2 1.6. 降低期望 2 1.7.
  • 原文地址:https://www.cnblogs.com/asako/p/14787417.html
Copyright © 2011-2022 走看看