栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java线程的学习

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java线程的学习

线程 创建线程的基本方式
  • 使用继承Thread类来创建线程
  • 案例:

1.请编写程序,开启一个线程,该线程每隔一秒,在控制台输出:“喵喵,我是小猫咪”

2.对上题进行改进:当输出80次喵喵我是小猫咪,结束该线程

3.使用 JConsole监控线程执行情况,并画出程序示意图

  • 代码演示
import java.sql.Time;


public class Thread01 {
    public static void main(String[] args) throws InterruptedException {
        cat cat = new cat();
        cat.start();//启动线程:最终会执行 cat的run方法,如果直接用cat.run的话,是不会启动Thread0线程的,就相当于run方法变成了普通的方法!
        //而且cat.run只有当run方法执行完毕后,才会往下执行,没有真正启动线程,变成了串行化的执行。
        //说明:当main线程启动一个子线程Thread-0,主线程不会阻塞,会继续执行
        System.out.println("主线程会继续执行不会阻塞"+Thread.currentThread().getName());//main
        for (int i = 0; i <60 ; i++) {
            System.out.println("主线程i="+i);
            //让主线程休眠
            Thread.sleep(1000);
        }

    }
}

//注意:当一个类继承了Thread类,该类就可以当做线程使用。
//我们会重写run方法,,写上自己的业务代码。
//run Thread类,实现了Runnable接口的run方法。
class cat extends Thread{

    @Override
    public void run() {//重写run方法,写上自己的业务逻辑
        int times = 1;
        while (times<=80){
        System.out.println("喵喵,我是小猫咪"+"  "+times+"线程名称"+Thread.currentThread().getName());
        try {
            //让该线程休眠一秒
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        times++;
        }
    }
}
使用实现Runndble接口来创建线程

说明:java是单继承的,在某些情况下一个诶可能已经继承了某个父类,这时再用继承Thread类方法来创建线程显然是不可能的!

所以java设计者们提供了另外一个方式创建线程,就是通过实现Runnable接口来创建继承

  • 应用案例:请编写程序,该程序可以每隔一秒在控制台输出 “ hi’!”,当输出10次后自动退出,注意请使用实现Runnable接口的方法来创建线程。(静态代理)
package com.yuecheng.hspedu.Runnable00;

public class Thread02 {
    public static void main(String[] args) {
        dog dog = new dog();
        //dog.start();这里不能调用start
        //创建Thread对象,把dog对象放入(已经实现Runnable接口)放入Thread,这个对象是有start方法的!!
        Thread thread = new Thread(dog);//这里使用了静态代理模式
        thread.start();
    }
}
class dog implements Runnable{//通过实现Runnable接口开发线程。

    int count = 1;
    @Override
    public void run() {//普通方法
        while (count<=10){
            System.out.println("hi !"+Thread.currentThread().getName()+count++);

            //休眠一秒(1000ms)
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

  • 静态代理的实现原理
package com.yuecheng.hspedu.Runnable00;
// 代码模拟实现Runnable接口,开发线程的机制
public class Runnable03 {
    public static void main(String[] args) {
        Tiger tiger = new Tiger();// 实现了Runnable接口

        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{//你可以把ThreadProxy类当做Thread

    private Runnable target = null;//属性,类型是Runnable
    @Override
    public void run() {
        if (target!=null){
            target.run();//动态绑定(运行类型Tiger)
        }
    }
    // 构造器接收Runnable接口的类型
    public ThreadProxy(Runnable target) {//把实现了Runnable接口的一个对象给ThreadProxy
        this.target = target;
    }
    public void start(){//这个方法是ThreadProxy里的,start()方法在调用start0(),再调用run,实现调出线程

        start0();//这个方法是真正实现多线程的方法!
    };
    public void start0(){//注:这是自己模拟的,所以没有底层实现,是创建不了线程的。真正实现多线程的是Thread里的start0()方法。
        run();
    };
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/351184.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号