1. 程式人生 > 其它 >Java自學-多執行緒(1)

Java自學-多執行緒(1)

Java自學-多執行緒(1)

1、初識併發問題

2、龜兔賽跑

package lesson01;

/**
 * Author: Gu Jiakai
 * Date: 2021/8/9 9:48
 * FileName: Race
 * Description:
 */
//模擬龜兔賽跑
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(100);
                } 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();
    }
}

3、實現Callable介面

4、靜態代理模式

package lesson02;

/**
 * Author: Gu Jiakai
 * Date: 2021/8/9 11:05
 * FileName: StaticProxy
 * Description:
 */

//靜態代理模式總結:
//真實物件和代理物件都要實現同一個介面
//代理物件要代理真實角色

// 好處:
//代理物件可以做很多真實物件做不了的事情
//真實物件專注做自己的事情



public class StaticProxy {
    public static void main(String[] args) {
        Wedding wedding = new Wedding(new You());
        wedding.HappyMarry();
    }
}

interface Mary{
    void HappyMarry();
}

//真實角色,你去結婚
class You implements Mary{

    @Override
    public void HappyMarry() {
        System.out.println("小明要結婚了,超開心!");
    }
}

//代理角色,幫助你結婚
class Wedding implements Mary{

    private Mary target;

    public Wedding(Mary target) {
        this.target = target;
    }

    @Override
    public void HappyMarry() {
        before();
        this.target.HappyMarry();//真實物件結婚
        after();
    }

    private void before() {
        System.out.println("結婚之前,佈置現場!");
    }

    private void after() {
        System.out.println("結婚之後,收尾款!");
    }


}

5、Lambda表示式

package lesson02;

/**
 * Author: Gu Jiakai
 * Date: 2021/8/9 11:29
 * FileName: TestLambda1
 * Description:
 */

/*
* 推導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();

//        4、區域性內部類。
        class Like3 implements ILike{
            @Override
            public void lambda() {
                System.out.println("I like Lambda3!");
            }
        }

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

        //5、匿名內部類。沒有類的名稱,必須藉助介面或者父類。
        like=new ILike() {
            @Override
            public void lambda() {
                System.out.println("I like Lambda4!");
            }
        };
        like.lambda();

        //6、用lambda簡化
        like=()->{System.out.println("I like Lambda5!");};
        like.lambda();

    }
}

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

class Like implements ILike{

    @Override
    public void lambda() {
        System.out.println("I like Lambda!");
    }
}
package lesson02;

/**
 * Author: Gu Jiakai
 * Date: 2021/8/9 15:30
 * FileName: TestLambda2
 * Description:
 */
public class TestLambda2 {
    public static void main(String[] args) {
//        Lambda表示式簡化。
//        Ilove love=(int a)->{System.out.println("I love you-->!"+a);};

//        簡化1:去掉引數型別。
//        Ilove love=(a)->{System.out.println("I love you-->!"+a);};
//        love.love(520);

//        簡化2:去掉括號。
//        Ilove love=a->{System.out.println("I love you-->!"+a);};
//        love.love(521);

        //簡化3:去掉花括號
        Ilove love=(a,b)->System.out.println("I love you-->!"+a+b);;
        love.love(521,502);


        //總結:
        //lambda表示式只能有一行程式碼的情況下才能簡化成為一行,如果有多行,那麼就用程式碼塊包裹。
        // 前提是介面為函式式介面
        //多個引數也可以去掉引數型別,要去掉就都去掉,必須加上括號,
    }
}

interface Ilove{
    void love(int a,int b);
}