多线程你不该知道的事?继承+静态代理模式

本文介绍了如何通过继承Thread类和实现Runnable接口创建线程,通过实例演示了线程启动的区别,并讨论了静态代理模式在Thread02中的应用。重点讲解了`start()`方法的作用以及如何确保线程并发执行。
摘要由CSDN通过智能技术生成

Thread源码 多线程趣味讲解

根据韩顺平老师课程做的笔记

***1、继承阶级

一个类继承Thread类 改类就可以当作线程使用

***2、继承衣钵

重写run方法

***3、实现家业

run Thread类实现了Runnable接口 run方法

在这里插入图片描述

简单使用案例一:

说明: 当main线程启动一个子线程thread-0 主线程不会阻塞,会继续执行

一、使用继承Thread

package com.company.duoxiancheng.review;

public class Thread01 {


    public static void main(String[] args) {
        cat cat1 = new cat();
        cat1.start(); //启动线程

    }


}
class cat extends Thread{
    int num=0;
    @Override
    public void run(){ //重写run方法 写上业务逻辑

        while (true){
        //线程每隔上一秒 在控制台输出“喵喵喵”
        System.out.println("喵喵我是zjq"+(++num));
        //休息一秒
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if (num==8){
            break;
        }
    }
    }
}

在这里插入图片描述

在这里插入图片描述

4、在继承家业的过程中 ,如果从家里面(main主函数) 每个人都获取了,都是败家子儿 没有一家花完最后一个子 那说明这个家业还在,只有花完最后一个子儿了 这个家业就是穷光蛋了

当然不光有儿子败家 万一还有孙子呢 ,反正不到最后一个子 这个进程就不会挂掉

2、启动线程为什么不使用run()方法 而用 start()方法

.start() 会启动线程 最终会执行run()方法

run() 就是一个普通的方法 执行起来和主线程就是串行执行

只有当run()方法执行完成才会执行其他的方法

说明:当main线程启动一个子线程 Thread-0 主线程就不会阻塞,会

继续执行

这时 主线程和子线程是交替执行

在这里插入图片描述

真正实现多线程的效果 是start()

二、通过实现Runnable接口

重写run()方法 不能直接使用run()!!!

package com.company.duoxiancheng.review;

public class Thread02 {
    public static void main(String[] args) {
            Dog dog = new Dog();
            //dog.start();这里不能调用start
            //创建Thread对象  把dog对象
            //设计模式:这里使用的是静态代理模式
            Thread thread=new Thread(dog);
            thread.start();
    }
}
class Dog implements Runnable{


    int count = 0;
    @Override
    public void run() {
        while (true){
            System.out.println("小狗汪汪叫"+(++count)+Thread.currentThread().getName());

            //休眠1s
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (count ==10){
                break;
            }
        }
    }
}

补充:设计模式-静态代理

模拟静态代理

我不能做的事 我交给你来帮我做

package com.company.duoxiancheng.review;

public class Thread02 {
    public static void main(String[] args) {
//            Dog dog = new Dog();
//            //dog.start();这里不能调用start
//            //创建Thread对象  把dog对象
//            //设计模式:这里使用的是静态代理模式
//            Thread thread=new Thread(dog);
//            thread.start();
        Tiger tiger = new Tiger();
        ThreadProxy threadProxy = new ThreadProxy(tiger);
        threadProxy.start();
    }
}


class Animal{ }
class Tiger extends Animal implements Runnable{


    @Override
    public void run() {
        System.out.println("老虎嗷嗷叫");
    }
}
//线程代理类  模拟一个极简的Thread类
class ThreadProxy implements Runnable{
    private Runnable target = null;

    @Override
    public void run() {
        if (target!=null){
            target.run();
        }
    }
    public ThreadProxy(Runnable target){
        this.target = target;
    }
    public void start(){
        start0(); //这个方法是最重要的启动线程的方法
    }
    public void start0(){
        run();
    }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值