多线程(续)

多线程(续)

1.静态代理模式

package com.tian.demo02;

import com.sun.org.apache.xpath.internal.functions.FuncSubstringAfter;

//静态代理模式总结:
//真实对象和代理对象都要实现同一个接口
//代理对象要代理真实角色
//好处:
    //代理对象可以做很多真实对象做不了的事情
    //真实对象专注做自己的事情
public class StacticProxy {
    public static void main(String[] args) {
        You you = new You();//你要结婚
        //WeddingCompany weddingCompany = new WeddingCompany(new You());
        //weddingCompany.HappyMarry();
        new WeddingCompany(new You()).HappyMarry();//上面两行合在一起
        new Thread(()-> System.out.println("我爱你")).start();
    }
}
interface Marry{
    //人间四大喜事
       //久旱逢甘露
       //他乡遇故知
       //洞房花烛夜
       //金榜题目时
    void HappyMarry();
}
//真实角色,你去结婚
class You implements Marry{
    @Override
    public void HappyMarry() {
        System.out.println("秦老师要结婚了,超开心");
    }
}
//代理角色,帮助你结婚
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("结婚之前,布置现场");
    }
}

2.lambda表达式

2.1逐步简化到lambda表达式

package com.tian.lambda;

/*
推导lambda表达式
 */
public class TestLambda1 {

    //3.静态内部类
    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();
    }

    //2.实现类
    class Like implements ILike {
        @Override
        public void lambda() {
            System.out.println("i like lambda");
        }
    }

2.2lambda表达式再简化

package com.tian.lambda;

public class TestLambda2 {
    public static void main(String[] args) {
        //lambda表达式简化
        ILove love = (int a)->{
            System.out.println("i love you1-->"+a);
        };
        //简化1:参数类型
        love = (a)->{
            System.out.println("i love you1-->"+a);
        };
        //简化2.简化括号
        love = a->{
            System.out.println("i love you1-->"+a);
        };
        //简化3.去掉花括号
        love = a -> System.out.println("i love you-->"+a);

        //总结:
            //lambda表达式只能有一行代码的情况下才能简化成为一行,如果有多行,那么就用代码块包裹。
            //前提是接口为函数式接口
            //多个参数也可以去掉参数类型,要去掉就都去掉,必须加()

        love.love(520);
    }
}

interface ILove{
    void love(int a);
}

3.线程的停止

package com.tian.state;
//测试stop
//1.建议线程正常停止-->利用次数,不建议死循环
//2.建议使用标志位-->设置一个标志位
//3.不要使用stop或者destroy等过时或者JDK不建议使用的方法
public class TestStop implements Runnable{
    //1.设置一个标志位
    private boolean flag = true;

    @Override
    public void run() {
        int i = 0;
        while (flag){
            System.out.println("run....Thread"+i++);
        }
    }
    //2.设置一个公开的方法停止线程,转换标志位
    public void stop(){
        this.flag = false;
    }

    public static void main(String[] args) {
        TestStop testStop = new TestStop();
        new Thread(testStop).start();
        for (int i = 0; i < 1000; i++) {
            System.out.println("main"+i);
            if(i==900){
                //调用stop方法切换标志位,让线程停止
                testStop.stop();
                System.out.println("线程停止了");
            }
        }
    }
}

4.线程休眠

4.1模拟延时

package com.tian.state;

import com.tian.demo01.TestThread4;

//模拟网络延时:放大问题的发生性
public class TestSleep implements Runnable{
    //票数
    private int ticketNums = 10;

    @Override
    public void run() {
        while (true){
            if (ticketNums <= 0 ){
                break;
            }
            //模拟延时
            try{
                Thread.sleep(100);
            }catch (InterruptedException e){
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread().getName()+"-->拿到了第"+ticketNums--+"票");
        }
    }

    public static void main(String[] args) {

        TestSleep ticket = new TestSleep();

        new Thread(ticket,"小明").start();
        new Thread(ticket,"老师").start();
        new Thread(ticket,"黄牛").start();
    }
}

4.2模拟倒计时

package com.tian.state;
//模拟倒计时
public class TestSleep2 {
    public static void main(String[] args) {
        try {
            tenDown();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
    //模拟倒计时
    public static void tenDown() throws InterruptedException{
        int num = 10;
        while (true){
            Thread.sleep(1000);
            System.out.println(num--);
            if(num <=0) {
                break;
            }
        }
    }
}

4.3打印当前时间

package com.tian.state;

import java.text.SimpleDateFormat;
import java.util.Date;

//模拟倒计时
public class TestSleep2 {
    public static void main(String[] args) {
        //打印当前时间
        Date startTime = new Date(System.currentTimeMillis());//获取系统当前时间

        while (true){
            try {
                Thread.sleep(1000);
                System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
                startTime = new Date(System.currentTimeMillis());//更新系统当前时间
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }

    //模拟倒计时
    public static void tenDown() throws InterruptedException{
        int num = 10;
        while (true){
            Thread.sleep(1000);
            System.out.println(num--);
            if(num <=0) {
                break;
            }
        }
    }
}

5.线程礼让

package com.tian.state;
//测试礼让线程
//礼让不一定成功,看CPU心情
public class TestYield {
    public static void main(String[] args) {
        MyYield myYield = new MyYield();
        new Thread(myYield,"a").start();
        new Thread(myYield,"b").start();
    }
}
class MyYield implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"线程开始执行");
        Thread.yield();
        System.out.println(Thread.currentThread().getName()+"线程停止执行");
    }
}

6.插队

package com.tian.state;
//测试join方法   想象成插队
public class TestJoin implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println("线程VIP来了"+i);
        }
    }

    public static void main(String[] args) throws InterruptedException{
        //启动我们的线程
        TestJoin testJoin = new TestJoin();
        Thread thread = new Thread(testJoin);
        thread.start();
        //主线程
        for (int i = 0; i < 500; i++) {
            if (i==200){
                thread.join();//插队
            }
            System.out.println("main"+i);
        }
    }
}
posted @ 2025-07-26 13:12  A那就算了吧  阅读(9)  评论(0)    收藏  举报