2021-2-28 线程

1 篇文章 0 订阅
1 篇文章 0 订阅

线程

1.extends Thread

类名 extends Thread

重写run()方法

调用.start()开启线程,调用.run()的话按main里现后顺序执行,没有同步效果

public class TestTread1 extends Thread{

    @Override
    public void run(){
        for (int i=0;i<200;i++) {
            System.out.println(Thread.currentThread().getName()+"在执行线程--"+i);
        }
    }

    public static void main(String[] args) {
        //多对象
        TestTread1 t1 = new TestTread1();
        TestTread1 t2 = new TestTread1();
        TestTread1 t3 = new TestTread1();

        t1.start();
        t2.start();
        t3.start();

        for (int i = 0; i < 200; i++) {
            System.out.println("在主方法--"+i);
        }
    }
}

2.实现 Runnable接口

类名 implements Runnable

//创建线程第二个方法: 1。实现runnable接口  2.重写run()方法  3. 执行线程需要丢入runnable接口实现,调用start方法。
public class TestTread2 implements Runnable{
    
    @Override
    public void run(){
        for (int i=0;i<200;i++) {
            System.out.println("在执行线程--"+i);
        }
    }

    public static void main(String[] args) {
        //创建runnable接口的实现类对象
        TestTread2 t1 = new TestTread2();

        //A.与直接继承extends主要区别是需要静态代理!!!(本质一样)
        //B.实现Runnable方便一个对象被多个线程使用,避免单继承局限性
        //创建线程对象,通过线程对象来开启我们的线程-----静态代理
        Thread thread = new Thread(t1);
        thread.start();
        //这两行等价于下面                                      
        //new Thread(t1).start();
        
        for (int i = 0; i < 200; i++) {
            System.out.println("在主方法--"+i);
        }
    }
}

3.多个线程同时操作同一个对象

火车票数据紊乱案例

//买火车票
//发现问题,多个线程操作同一对象时,线程不安全,数据紊乱
public class TestTread3 implements Runnable{
    //票数
    private int tacketNumbers = 10;
    public void run(){
        while(true){
            if(tacketNumbers<=0){
                break;
            }
            //模拟延时
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"-->拿到了第"+tacketNumbers--+"张票");
        }
    }
    public static void main(String[] args) {
        //一个对象 ticker
        TestTread3 ticker = new TestTread3();
        //开启三个线程同时操作ticker
        new Thread(ticker , "小明").start();
        new Thread(ticker , "小红").start();
        new Thread(ticker , "黄牛").start();
    }
}

龟兔赛跑案例

public class Race implements Runnable{
    private static String winner;

    @Override
    public void run(){
        for(int i = 0;i<101;i++){
            //模拟兔子睡觉
            if(Thread.currentThread().getName().equals("兔子")&& i%10==0){
                try {//ctrl alt t 快捷包裹
                    Thread.sleep(200);
                } 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();
    }
}

4.实现callable接口

//Callable的好处
//1.可以定义返回值
//2.可以抛出异常

public class Test1 implements Callable<Boolean> {//Callable的<>里面要一个返回值
    private String url;  //网络图片地址
    private String name; //图片名字

    public Test1(String url, String name){
        this.url = url;
        this.name = name;
    }

    @Override
    //重写call方法
    public Boolean call(){
        //方法体
        return true;
    }

    public static void main(String[] args) {
        //Test1 t1 = new Test1(url,name);//此处没给url和名字
        //Test1 t2 = new Test1(url,name);
        //Test1 t3 = new Test1(url,name);

        //1.创建服务
        ExecutorService ser = Executors.newFixedThreadPool(3);//三个线程

        //2.提交执行
        //Future<Boolean> r1  = ser.submit(t1);
        //Future<Boolean> r2  = ser.submit(t2);
        //Future<Boolean> r3  = ser.submit(t3);

        //3.获取结果
        //boolean rs1 = r1.get();
        //boolean rs2 = r2.get();
        //boolean rs3 = r3.get();

        //可以打印返回值rs1,rs2,rs3
        //System.out.println(rs1);//返回真,前面给定了
        //System.out.println(rs2);
        //System.out.println(rs3);

        //4.关闭服务
        ser.shutdownNow();
    }
}

5.静态代理

//静态代理模式:
//1.真实对象(要结婚的客人)和代理对象(婚庆公司)都要事先同一个接口
//2.代理对象要代理真实角色

//好处:
//代理对象能做很多真实对象做不了的事情
//真是对象专注做自己的事情

public class Test1 {
    public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {

            }
        }).start();

        WeddingCompany wc1 = new WeddingCompany(new You());
        wc1.HappyMarry();
        //或者 new WeddingCompany(new You()).HappyMarry();

    }
}

interface Marry{
    void HappyMarry();
}

class You implements Marry{
    @Override
    public void HappyMarry(){
        System.out.println("客人要结婚了");
    }
}

class WeddingCompany implements Marry{
    private Marry target;//确定要帮谁结婚target

    public WeddingCompany(Marry 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("结婚后");
    }
}

6.lambda表达式

/*
* lambda表达式演变
* 目的:
* 简洁代码
* 函数式编程
* */
public class Lambda {

    //3.静态内部类
    static class  Like2 implements ILike{
        @Override
        public void lambda() {
            System.out.println("i like lambda2");
        }
    }



    public static void main(String[] args) {
        ILike ilike= new Like();
        ilike.lambda();

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

        //4.局部内部类
        class Like3 implements ILike{
            @Override
            public void lambda() {
                System.out.println("i like lambda3");
            }
        }
        ilike = new Like3();
        ilike.lambda();

        //5.匿名内部类,没有类的名称,必须借助接口或者父类. 重写方法
        ilike = new ILike() {
            @Override
            public void lambda() {
                System.out.println("i like lambda4");
            }
        };
        ilike.lambda();

        //6.用lambda简化
        ilike = ()->{
            System.out.println("i like lambda5");
        };
        ilike.lambda();
    }

}
//函数类接口,指接口只有一个抽象函数(方法)
//1.定义一个函数类接口
interface ILike{
    void lambda();
}

//2.实现类
class Like implements ILike{
    @Override
    public void lambda() {
        System.out.println("i like lambda");
    }
}
/*
对lambda表达式的进一步化简
*/
public class Lamdba2 {
    public static void main(String[] args) {
        Ilove love = (int a)->{
            System.out.println("i love u "+a);
        };
        //简化1.去掉参数类型
        Ilove love1 = (a)->{
            System.out.println("i love u "+a);
        };

        //简化2.去掉括号
        Ilove love2 = a->{
            System.out.println("i love u "+a);
        };
        love2.love(521);

        //简化3.去掉花括号
        Ilove love3 = a->
            System.out.println("i love u "+a);
        love3.love(522);

        /*
         * 总结:
         * lambda表达式,只能有一行代码的情况下才能简化成为1行,多行就用{}包裹
         * 前提是接口为函数式接口
         * 多个参数也可以去掉参数类型
         * */
    }
}

interface Ilove{
    void love (int a);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值