java线程实现的三种方式以及静态代理

java1234

共 13543字,需浏览 28分钟

 ·

2021-03-15 09:24

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

  作者 |  Sprinining

来源 |  urlify.cn/aIZZFb

76套java从入门到精通实战课程分享

线程

  • 一个进程中若开辟多个线程,线程的运行由调度器控制,先后顺序不能人为干预。

  • 实现方式

      继承 Thread类

    • 调用run方法,只有主线程一条路

    • 调用start方法,主线程和子线程并行交替执行

    public class MyThread extends Thread{

        @Override
        public void run() {
            for (int i = 0; i < 20; i++) {
                System.out.println("xixi");
            }
        }

        public static void main(String[] args) {

            MyThread myThread = new MyThread();
            //myThread.run();只有主线程一条路,先xixi后haha
            //开启线程,不一定立刻执行,由cpu调度
            myThread.start();//同时运行,xixi、haha交替

            //main线程
            for (int i = 0; i < 20; i++) {
                System.out.println("haha");
            }
        }

    }
    • 导入common-io.jar下载图片

               

import org.apache.commons.io.FileUtils;

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

public class MyThread2 extends Thread{

    private String url;
    private String name;

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

    @Override
    public void run() {
        WebDownloader webDownloader = new WebDownloader();
        webDownloader.downloader(url, name);
        System.out.println("下载了文件名为" + name);

    }

    public static void main(String[] args) {
        MyThread2 t1 = new MyThread2("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg""csgo1.jpg");
        MyThread2 t2 = new MyThread2("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg""csgo2.jpg");
        MyThread2 t3 = new MyThread2("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg""csgo3.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("downloader异常");
        } finally {
        }
    }
}
  • 实现Runnable接口

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

    public class MyThread3 implements Runnable{
        @Override
        public void run() {
            for (int i = 0; i < 20; i++) {
                System.out.println("xixi");
            }
        }

        public static void main(String[] args) {

            //创建实现runnable接口的类对象
            MyThread3 myThread3 = new MyThread3();
            //创建线程对象,通过线程对象启动线程,代理
            new Thread(myThread3).start();


            for (int i = 0; i < 20; i++) {
                System.out.println("haha");
            }
        }
    }
  • 多线程同时操作一个对象

public class MyThread4 implements Runnable{

    private int ticketNums = 10;

    @Override
    public void run() {
        while (true){
            if(ticketNums <= 0)
                break;

            //模拟延时
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "拿到了第" + ticketNums-- + "张票");
        }
    }

    public static void main(String[] args) {
        MyThread4 myThread4 = new MyThread4();
        new Thread(myThread4, "haha").start();
        new Thread(myThread4, "xixi").start();
        new Thread(myThread4, "hehe").start();

    }

}
//多个线程操作同一个资源时,线程不安全,数据紊乱
/*
haha拿到了第9张票
xixi拿到了第8张票
hehe拿到了第10张票
hehe拿到了第6张票
xixi拿到了第7张票
haha拿到了第5张票
hehe拿到了第4张票
haha拿到了第4张票
xixi拿到了第4张票
xixi拿到了第2张票
hehe拿到了第3张票
haha拿到了第1张票
 */

  • 实现Callable接口

  •  可以定义返回值、可以抛出异常

  • import org.apache.commons.io.FileUtils;

    import java.io.File;
    import java.io.IOException;
    import java.net.URL;
    import java.util.concurrent.*;

    public class MyCallable implements Callable<Boolean> {

        private String url;
        private String name;

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

        @Override
        public Boolean call() throws Exception {
            WebDownloader webDownloader = new WebDownloader();
            webDownloader.downloader(url, name);
            System.out.println("下载了文件名为" + name);
            return true;
        }

        public static void main(String[] args) throws ExecutionException, InterruptedException {
            MyCallable t1 = new MyCallable("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg""csgo1.jpg");
            MyCallable t2 = new MyCallable("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg""csgo2.jpg");
            MyCallable t3 = new MyCallable("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg""csgo3.jpg");

            //创建执行服务
            ExecutorService ser = Executors.newFixedThreadPool(3);

            //提交执行
            Future<Boolean> r1 = ser.submit(t1);
            Future<Boolean> r2 = ser.submit(t2);
            Future<Boolean> r3 = ser.submit(t3);

            //获取结果
            boolean rs1 = r1.get();
            boolean rs2 = r2.get();
            boolean rs3 = r3.get();

            //关闭服务
            ser.shutdown();
        }


    }

    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("downloader异常");
            } finally {
            }
        }
    }
  • 静态代理

  • 真实对象和代理对象都要实现同一个接口

  • 代理对象要代理真实角色

  • 代理对象可以做很多真实对象做不了的事情

  • 真实对象专注做自己的事情

public class StaticProxy {
    public static void main(String[] args) {

        You you = new You();

        //代理真实对象runnable
        new Thread(()-> System.out.println("haha")).start();
        
        //代理真实对象you
        new WeddingCompany(new You()).HappyMarry();

        WeddingCompany weddingCompany = new WeddingCompany(you);
        weddingCompany.HappyMarry();
    }
}

interface Marry{
    void HappyMarry();
}

//真实角色
class You implements Marry{
    @Override
    public void HappyMarry() {
        System.out.println("marry!");
    }
}

//代理角色
class WeddingCompany implements Marry{
    
    private Marry target;

    public WeddingCompany(Marry target){
        this.target = target;
    }

    @Override
    public void HappyMarry() {
        before();
        this.target.HappyMarry();//真实对象
        after();
    }


    public void before() {
        System.out.println("before marry");
    }
    public void after() {
        System.out.println("after marry");
    }
}






锋哥最新SpringCloud分布式电商秒杀课程发布

👇👇👇

👆长按上方微信二维码 2 秒





感谢点赞支持下哈 

浏览 19
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报