Java自学-多线程(1)

2021/8/9 17:06:02

本文主要是介绍Java自学-多线程(1),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Java自学-多线程(1)

1、初识并发问题

image-20210809092644675

2、龟兔赛跑

image-20210809105638193

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接口

image-20210809105902661

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表达式

image-20210809112649572

image-20210809112749241

image-20210809112843064

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);
}


这篇关于Java自学-多线程(1)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程