继承Thread vs 实现Runnable的区别以及线程的常用方法

举报
荞慧子 发表于 2022/12/31 19:46:14 2022/12/31
【摘要】 继承Thread vs 实现Runnable的区别(1)从java的设计来看,通过继承Thread或者实现Runnable接口来创建线程本质上没有区别,从jdk帮助文档我们可以看到Thread类本身就实现了Runnable接口。(2)实现Runnable接口方式更加适合多个线程共享一个资源的情况,并且避免了单继承的限制,建议使用Runnable。案例演示模拟三个售票窗口售票100张,分别使用...

继承Thread vs 实现Runnable的区别

(1)从java的设计来看,通过继承Thread或者实现Runnable接口来创建线程本质上没有区别,从jdk帮

助文档我们可以看到Thread类本身就实现了Runnable接口。

(2)实现Runnable接口方式更加适合多个线程共享一个资源的情况,并且避免了单继承的限制,建议

使用Runnable。

案例演示

模拟三个售票窗口售票100张,分别使用继承Thread和实现Runnable方式,并分析有什么问题

public class SellTicket {
    public static void main(String[] args) {
        //测试
        // SellTicket01 sellTicket01 = new SellTicket01();
        // SellTicket01 sellTicket02 = new SellTicket01();
        // SellTicket01 sellTicket03 = new SellTicket01();
        //
        // //这里我们会出现超卖.. // sellTicket01.start();//启动售票线程
        // sellTicket02.start();//启动售票线程
        // sellTicket03.start();//启动售票线程
        System.out.println("===使用实现接口方式来售票=====");
        SellTicket02 sellTicket02 = new SellTicket02();
        new Thread(sellTicket02).start();//第 1 个线程-窗口
        new Thread(sellTicket02).start();//第 2 个线程-窗口
        new Thread(sellTicket02).start();//第 3 个线程-窗口
    }
}

//使用 Thread 方式
class SellTicket01 extends Thread {
    private static int ticketNum = 100;//让多个线程共享 ticketNum
    @Override
    public void run() {
        while (true) {
            if (ticketNum <= 0) {
                System.out.println("售票结束...");
                break;
            }
        //休眠 50 毫秒, 模拟
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票" + " 剩余票数=" + (--ticketNum));
        }
    }
}

//实现接口方式
class SellTicket02 implements Runnable {
    private int ticketNum = 100;//让多个线程共享 ticketNum
    @Override
    public void run() {
        while (true) {
            if (ticketNum <= 0) {
            System.out.println("售票结束...");
            break;
        }
        //休眠 50 毫秒, 模拟
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票" + " 剩余票数=" + (--ticketNum));//1 - 0 - -1 - -2
        }
    }
}

线程终止基本说明

(1)当线程完成任务后,会自动退出

(2)还可以通过使用变量来控制run方法退出的方式停止线程,即通知方式

线程常用方法

常用方法第一组

(1)setName //设置线程名称,使其与函数name相同

(2)getName //返回该线程的名称

(3)start //使该线程开始执行;Java虚拟机底层调用该线程的start0方法

(4)run //调用该线程对象run方法

(5)setPriority //更改线程的优先级

(6)getPriority //获取线程的优先级

(7)sleep //在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)

(8)interrupt //中断线程

注意事项和使用细节

(1)start底层会创建新的线程,调用run,run就是一个简单的方法调用,不会启动新线程

(2)线程优先级的范围

(3)interrupt,中断线程,但并没有真正的结束线程。所以一般用于中断正在休眠的线程

(4)sleep,线程的静态方法,使当前线程休眠

常用方法第二组

(1)yield:线程的礼让。让出CPU,让其他线程执行,但礼让的时间不确定,所以也不一定礼让成功

(2)join:线程的插队。插队的线程一旦插队成功,则肯定先执行完插入的线程所有的任务



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。