继承Thread vs 实现Runnable的区别以及线程的常用方法
继承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:线程的插队。插队的线程一旦插队成功,则肯定先执行完插入的线程所有的任务
- 点赞
- 收藏
- 关注作者
评论(0)