1. 程式人生 > 實用技巧 >easyUI datagrid view擴充套件

easyUI datagrid view擴充套件

多執行緒知識點

--多執行緒基礎—(執行緒小案例)

建立執行緒-Thread

1.建立執行緒TestThread1 觀察主執行緒和run執行緒體的執行結果 (順序)

//建立執行緒方式1:繼承Thread類,重寫run()方法,呼叫start開啟執行緒
//總結:注意,執行緒開啟不一定立即執行,由CPU排程執行

public class TestThread1 extends Thread {
    @Override
    public void run() {
        //run方法執行緒體
        for (int i = 0; i < 200; i++) {
            System.out.println("我在圖書館---"+i);
        }
    }

    public static void main(String[] args) {
        //main執行緒  -主執行緒
        //建立一個執行緒物件
        TestThread1 testThread1=new TestThread1();
        //呼叫start()方法 開啟執行緒
        //此時這裡是start方法 使主執行緒main和run方法執行緒體同時進行
        //如果把start換成run方法 則會先執行完run()再執行main主方法
        testThread1.start();

        for (int i = 0; i < 1000; i++) {
            System.out.println("我在學習多執行緒--"+i);
        }
        }
    }

2.建立執行緒TestThread2 觀察T1 T2 T3 三個順序執行但不順序執行

(按照方法 理應先執行t1 然後是t2 t3) 但執行結果每次都不一樣 所以執行緒的執行順序不一樣的)

此案例需要匯入lib jar包 下載地址:

http://commons.apache.org/proper/commons-io/download_io.cgi

package com.gao;


import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
//練習Thread,實現多執行緒同步下載多個圖片
public class TetsThread2 extends Thread {
    private String url;//圖片地址
    private String name;//圖片名稱

    public TetsThread2(String url,String name){
        this.url=url;
        this.name=name;
    }
        //下載圖片執行緒的執行體
    public void run(){
        webDownloader webDownloader=new webDownloader();
        webDownloader.downloader(url,name);
        System.out.println("下載了檔名為"+name);
    }

    public static void main(String[] args) {
        TetsThread2 t1=new TetsThread2("https://uploadfiles.nowcoder.com/images/20190422/392538858_1555913364515_1DFB6E348B5F86DDF063259779AECF89","1.jpg");
        TetsThread2 t2=new TetsThread2("https://uploadfiles.nowcoder.com/images/20190422/392538858_1555913378487_493AF0131422EB9655B98CF0AB9D5244","2.jpg");
        TetsThread2 t3=new TetsThread2("https://uploadfiles.nowcoder.com/files/20200326/548380650_1585215809223_php.png","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方法出錯");
            }
        }
}

}

3.模擬線上搶票問題

package com.gao;
//模擬線上搶票
//發現問題:多個執行緒操作同一資源的情況下,執行緒不安全,資料紊亂
public class TestThread4 implements Runnable {
    //總票數
private int ticknumber =10;
    public void run(){
        while (true){
    if (ticknumber<=0){
        break;
    }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"-->拿到了"+ticknumber--+"張票");
        }
    }

    public static void main(String[] args) {
        TestThread4 ticket=new TestThread4();

        new Thread(ticket,"小明").start();
        new Thread(ticket,"小王").start();
        new Thread(ticket,"小紅").start();
    }
}

4.模擬龜兔賽跑案例

package com.gao;
//模擬龜兔賽跑

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=gameover(i);
            if (flag){
                break;
            }
            System.out.println(Thread.currentThread().getName()+"-->跑了"+i+"步");
        }
    }
    //判斷是否完成比賽
    private boolean gameover(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();
    }
}


靜態模式代理(結婚案例)

package com.gao.demo2;

//靜態代理模式總結:
//真實物件和代理物件都要實現同一個介面
//代理物件需要代理真實角色
//好處:代理物件可以做很多真實物件做不了的事情
        //真實物件專注做自己的事情
public class StacticProxy {
    public static void main(String[] args) {
        new Thread(()-> System.out.println("I love You ")).start();

        new weddingCompany(new you()).HappyMarry();

        you you=new you();//你要結婚
        weddingCompany weddingCompany=new weddingCompany(new you());
        weddingCompany.HappyMarry();

    }
}

interface Marry{

    void HappyMarry();
}

//真實角色
class you implements Marry{

    @Override
    public void HappyMarry() {
        System.out.println("Get married so Happy");
    }
}
//代理角色 幫你結婚
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("結婚之前 佈置現場");
    }
}

lamda 表示式

1.推導lamda表示式(從靜態內部類 區域性內部類 匿名內部類 簡化到lamda表示式)

package com.gao.lamda;
/*
推導lamda表示式
 */
public class Testlamda1 {
    //3.靜態內部類
    static  class Like2 implements Ilike{

        @Override
        public void lambda() {
            System.out.println("I like lamda2");
        }
    }

    public static void main(String[] args) {
        Ilike like=new like();
        like.lambda();

        like=new Like2();
        like.lambda();

        //4.區域性內部類
        class Like3 implements Ilike{

            @Override
            public void lambda() {
                System.out.println(" i like lamda3");
            }
        }
        like=new Like3();
        like.lambda();

    //5.匿名內部類,沒有類的名稱,必須藉助介面或父類
        like=new Ilike() {
            @Override
            public void lambda() {
                System.out.println("i like lamda4");
            }
        };
        like.lambda();

        //6.用lamda簡化
        like=()->{
            System.out.println("i like lamda 5");
        };
        like.lambda();

    }

}

//1.定義一個函式介面
interface  Ilike{
    void  lambda();
}

//2.定義實現類
class like implements  Ilike{

    @Override
    public void lambda() {
        System.out.println("I like lamda");
    }
}
  1. lamda表示式的從複雜到最簡的簡化過程

    總結:/總結 //lamda表示式 只能有一行程式碼的情況才能簡化成一行, //如果多行只能用程式碼塊包裹 //前提還得介面必須是函式式介面(介面內只有一個方法)(此案例 介面Ilove內只有一個方法love)

    package com.gao.lamda;
    
    public class Testlamda2 {
    
        public static void main(String[] args) {
    
                //1.lamda 表示簡化
               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);
    
    
                //總結
                    //lamda表示式 只能有一行程式碼的情況才能簡化成一行,
                    //如果多行只能用程式碼塊包裹
                    //前提還得介面必須是函式式介面(介面內只有一個方法)(此案例 介面Ilove內只有一個方法love)
    
    
    
               love.love(520);
           }
        }
    
    interface Ilove{
        void love(int a);
    }
    
    

--多執行緒和高併發高階

第一節 執行緒的基本概念

三種執行緒方法
  1. sleep ,意思就是睡眠 ,當前執行緒暫停一段時間讓給別的執行緒去執行,sleep是由睡眠時間而定,等規定的時間到了自動復活
  2. Yield 就是當前執行緒正在執行的時候停止下來進入等待佇列 ,回到等待佇列裡在系統的排程演算法裡呢 還是依然可能把你剛回去的這個執行緒拿回來繼續執行,意思就是我讓出來一下CPU,後面排程能不能搶到就不管了。
  3. join 意思就是在自己當前執行緒加入你呼叫的執行緒(),本執行緒等待。等呼叫的執行緒執行完 自己再去執行。例如:ti和t2兩個執行緒,在t1的某個點上呼叫了t2.join,它會跑到t2上去執行 ,t1等t2執行完後,t1和t2併成為一條線再去執行(自己 jion 自己 沒意義)
執行緒狀態

常見的執行緒狀態有六種:

當我們new一個執行緒時,還沒呼叫start()該執行緒 處於 新建狀態

執行緒呼叫start()方法時 它會被執行緒排程器執行,也就是交給作業系統執行,這整個狀態就叫Runnable 內部有(1)Ready就緒狀態/(2)Running執行狀態

如果執行緒順利執行完了就會進入(3)Teminated結束狀態,

在Runnable 這個人狀態裡還有一些狀態的變遷 (4)TimedWaiting等待、(5)Waiting等待、(6)Blocked阻塞。

synchronized鎖
  • synchronized鎖的是物件 並不是鎖的程式碼 這一點一定要搞清楚