继承Thread vs 实现Runnable的区别以及线程的常用方法
【摘要】 继承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)