1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        java線程實現(xiàn)的三種方式以及靜態(tài)代理

        共 13543字,需瀏覽 28分鐘

         ·

        2021-03-15 09:24

        點擊上方藍色字體,選擇“標星公眾號”

        優(yōu)質(zhì)文章,第一時間送達

          作者 |  Sprinining

        來源 |  urlify.cn/aIZZFb

        76套java從入門到精通實戰(zhàn)課程分享

        線程

        • 一個進程中若開辟多個線程,線程的運行由調(diào)度器控制,先后順序不能人為干預。

        • 實現(xiàn)方式

            繼承 Thread類

          • 調(diào)用run方法,只有主線程一條路

          • 調(diào)用start方法,主線程和子線程并行交替執(zhí)行

          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
                  //開啟線程,不一定立刻執(zhí)行,由cpu調(diào)度
                  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 {
                }
            }
        }
        • 實現(xiàn)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) {

                  //創(chuàng)建實現(xiàn)runnable接口的類對象
                  MyThread3 myThread3 = new MyThread3();
                  //創(chuàng)建線程對象,通過線程對象啟動線程,代理
                  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();

            }

        }
        //多個線程操作同一個資源時,線程不安全,數(shù)據(jù)紊亂
        /*
        haha拿到了第9張票
        xixi拿到了第8張票
        hehe拿到了第10張票
        hehe拿到了第6張票
        xixi拿到了第7張票
        haha拿到了第5張票
        hehe拿到了第4張票
        haha拿到了第4張票
        xixi拿到了第4張票
        xixi拿到了第2張票
        hehe拿到了第3張票
        haha拿到了第1張票
         */

        • 實現(xiàn)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");

                  //創(chuàng)建執(zhí)行服務
                  ExecutorService ser = Executors.newFixedThreadPool(3);

                  //提交執(zhí)行
                  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 {
                  }
              }
          }
        • 靜態(tài)代理

        • 真實對象和代理對象都要實現(xiàn)同一個接口

        • 代理對象要代理真實角色

        • 代理對象可以做很多真實對象做不了的事情

        • 真實對象專注做自己的事情

        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分布式電商秒殺課程發(fā)布

        ??????

        ??長按上方微信二維碼 2 秒





        感謝點贊支持下哈 

        瀏覽 61
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            精品久久久久久久久久 | 色五月天综合 | 久久停停 | 蜜糖直播 | 新婚夜第一次深深挺进 | 搜黄色一级操逼的 | 国产中文字幕网 | 婷婷色午夜 | 流量变现@wuking6 | 国产精品理论视频 |