创建多线程的方式二:实现Runnable接口

步骤:
1.创建一个实现了Runnable接口的类
2.实现类去实现Runnable中的抽象方法run
3.创建实现类的对象
4.将此对象传递给Thread的构造器中,创建Thread类的对象
5.通过Thread类的对象调用start()方法

package test0;

public class ThreadDemo {
    public static void main(String[] args) {
       
        MyThread m=new MyThread();
        Thread t= new Thread(m);
        t.setName("线程一");
        t.start();//不管是采用哪种方法创建多线程,要想启动线程,必须调用Thread类中的start方法
        //线程是调用start方法的那个,所以t是线程,m不是线程
        //问题是start方法调用的是当前线程的run方法,应该是调用t的run。而m又不是线程,为什么m的run会被执行?
        //这里由于构造器中传了那个实现接口的对象,会执行那个对象的run,可以去看源码
        //源码中实际上是当前线程的run中调用了传进来的那个东西的run

        //再启动一个线程的操作
        Thread t2=new Thread(m);
        t2.setName("线程二");
        t2.start();
    }
}
class MyThread implements Runnable{
    @Override
    public void run() {
        for(int i=0;i<100;i++){
            if(i%2==0){
                System.out.println(i+":"+Thread.currentThread().getName());
            }
        }
    }
}

继承Thread类和实现Runnable接口创建多线程方式的对比
实现的方式要好一些
继承对于类来说有局限性,继承了Thread之后就没有办法再去继承其他的类了
实现的方式更容易实现共享数据
优先选择实现的方式
注意: Thread类也实现了Runnable接口,也重写了Runnable中的抽象方法run
两种方式都需要将线程要执行的操作放在run方法中

线程的生命周期:
某个结构,从他的出生到消亡过程叫做生命周期
在源码中,thread的几个状态是放在枚举类State当中的,枚举类当中的一些对象,定义了线程的几种状态

NEW:刚创建的(还没用start方法)
RUNNABLE:执行start方法后,执行起来
BLOCKED:阻塞
TERMINATED:死亡
等等

新建状态:对象刚创建
调用start方法进入就绪状态
不是说一调用start就马上开始执行,此时处于就绪阶段,CPU还要分配资源,一旦分配资源就处于运行阶段
比如;
t1.start();
t2.start();
虽然t1先start但输出结果中可能先输出t2的东西

实际上不是线程去抢CPU的资源,而是CPU主动分配资源(获取CPU执行权)
失去CPU执行权不是阻塞,只是从运行状态回到就绪状态
调用yield也可以主动释放执行权,使得从运行状态回到就绪状态

死亡状态不能恢复
运行阶段执行完run方法,或者调用stop()方法或者出现Error/Exception且没处理会进入到死亡状态

阻塞和就绪不一样,阻塞是CPU想分配资源也分配不了资源
阻塞一定不是线程的最终状态,线程的最终状态只能是死亡
处于阻塞状态下不能直接进入运行,要先进入就绪状态,才能进入运行状态

在运行阶段进入阻塞阶段的操作
sleep(long time)
join()
等待同步锁
wait()
suspend()(把一个线程挂起)(注意这个方法已过时)

从阻塞状态进入就绪状态的操作
sleep的时间到了
join对应的线程执行完毕
获取了同步锁
notify()
notifyAll()
resume()(和suspend搭配使用,结束挂起状态。已被废弃)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值