线程

多线程

三种线程创建方式

  1. 继承Thread 重写run()方法

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

    启动:之类对象.start()

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

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

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

    传入目标对象+Thread对象.start()

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

    package demo02;
    
    //创建线程的第二种方式
    //实现Runnable接口
    //实现run()方法
    //调用start()方法启动线程
    public class Demo04 implements Runnable{
        @Override
        public void run() {
            //run方法体线程
            for (int i = 0; i < 20; i++) {
                System.out.println("我在执行run方法体线程" + i);
            }
        }
    
        public static void main(String[] args) {
            //main方法体线程
    
            //创建Runnable接口的实现类对象
            Demo04 demo04 =new Demo04();
            //创建线程对象通过线程对象来开启线程代理
            Thread thread=new Thread(demo04);
            thread.start();
            //可整合为如下代码
            //new Thread(demo04).start();
    
            for (int i = 0; i < 200; i++) {
                System.out.println("我在学习线程代码" + i);
            }
    
        }
    
    }
    
    
  3. 实现Callable接口 重写call()方法,需抛出异常

    创建执行服务

    提交执行

    获取结果

    关闭服务

    package demo02;
    
    import org.apache.commons.io.FileUtils;
    
    import java.io.File;
    import java.io.IOException;
    import java.net.URL;
    import java.util.concurrent.*;
    
    //创建线程的第三种方式 实现Callable 重写call()方法   好处:可获取返回值 ,可抛出异常
    //1.创建服务 2.提交执行 3.获取返回值  4.结束服务
    public class Demo7 implements Callable<Boolean> {
    
    
        private String url;  //网络图片地址
        private String name;  //保存的文件名
    
        public Demo7(String url,String name){
            this.url=url;
            this.name=name;
        }
    
        //下载图片线程的执行体
        @Override
        public Boolean call() {
            WebDownloder1 webDownloder= new WebDownloder1();
            webDownloder.downloder(url,name);
            System.out.println("下载了名字为"+name+"的图片");
            return  true;
        }
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            //路线一
            Demo7 demo01 =new Demo7("https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1603365312,3218205429&fm=26&gp=0.jpg","0.jpg");
            //路线二
            Demo7 demo02 =new Demo7("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1730713693,2130926401&fm=26&gp=0.jpg","1.jpg");
            //路线三
            Demo7 demo03 =new Demo7("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic3.16pic.com%2F00%2F01%2F11%2F16pic_111395_b.jpg&refer=http%3A%2F%2Fpic3.16pic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1618558782&t=d166699d2a0f1d186ba42782ecee1cb6","2.jpg");
            //创建执行服务
            ExecutorService service= Executors.newFixedThreadPool(3);
            //提交执行
            Future<Boolean> res1=service.submit(demo01);
            Future<Boolean> res2=service.submit(demo02);
            Future<Boolean> res3=service.submit(demo03);
            //获取结果
            boolean r1=res1.get();
            boolean r2=res2.get();
            boolean r3=res3.get();
            System.out.println(r1);
            System.out.println(r2);
            System.out.println(r3);
            //关闭服务
            service.shutdownNow();
        }
    }
    //下载器
    class  WebDownloder1{
        //下载方法
        public  void  downloder(String url, String name){
            try {
                FileUtils.copyURLToFile(new URL(url),new File(name)); //导入FileUtils包
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("IO异常,downloder方法出现问题");
            }
    
        }
    }
    

Thread 实现多线程同步下载图片

package demo02;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;

//练习Thread 实现多线程同步下载图片  lib引入commons-io 的jar包
public class Demo03 extends  Thread{
    private String url;  //网络图片地址
    private String name;  //保存的文件名

    public Demo03(String url,String name){
        this.url=url;
        this.name=name;
    }

    //下载图片线程的执行体
    @Override
    public void run() {
        WebDownloder webDownloder= new WebDownloder();
        webDownloder.downloder(url,name);
        System.out.println("下载了名字为"+name+"的图片");
    }

    public static void main(String[] args) {
        //路线一
        Demo03 demo01 =new Demo03("https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1603365312,3218205429&fm=26&gp=0.jpg","0.jpg");
        //路线二
        Demo03 demo02 =new Demo03("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1730713693,2130926401&fm=26&gp=0.jpg","1.jpg");
        //路线三
        Demo03 demo03 =new Demo03("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic3.16pic.com%2F00%2F01%2F11%2F16pic_111395_b.jpg&refer=http%3A%2F%2Fpic3.16pic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1618558782&t=d166699d2a0f1d186ba42782ecee1cb6","2.jpg");
        demo01.start();
        demo02.start();
        demo03.start();
    }
}
//下载器
class  WebDownloder{
    //下载方法
    public  void  downloder(String url, String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name)); //导入FileUtils包
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO异常,downloder方法出现问题");
        }

    }
}

简单的静态代理

package demo02;
//静态代理模式
//代理模式   真实对象和代理对象要实现同一个接口  代理对象要代理真实对象
//好处。代理对象可以做很多真实对象做不了的事情  真实对象可专注做自己的事情
public class Demo08 {

    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() {
       befor();
       this.target.HappyMarry();  //真实对象结婚
       after();
    }

    private void after() {   //代理对象完成的其他事情
        System.out.println("收尾款");
    }

    private void befor() {   //代理对象完成的其他的事情
        System.out.println("布置现场");
    }
}
posted @ 2021-03-22 09:09  仅此忆念  阅读(39)  评论(0)    收藏  举报