Java线程

一、线程的创建方式
1、继承Thread类,重写run方法:

创建一个继承于 Thread类的子类
重写Thread类的 run()方法->此线程执行的操作声明在 run()中,如遍历100以内所有的偶数
创建此子类对象
调用 start()方法:有两个作用:①启动当前线程 ②调用当前线程的 run()

2、实现Runnable接口,实现run方法:

创建一个实现了 Runnable接口的类
实现类去实现 Runnable接口中的抽象方法:run()
创建实现类的对象
将此实现类作为参数传递到 Thread类的构造器中,创建 Thread类的对象
通过 Thread类的对象调用 start()

3、实现Callable接口,实现call方法,该方式可以获取线程的执行结果

创建一个实现 Callable接口的实现类​​​​​​​
实现 call()方法,将此线程需要执行的操作声明在 call()中
创建 Callable接口实现类的对象
将此 Callable接口实现类的对象作为参数传递到 FutureTask构造器中,创建 FutureTask对象
将 FutureTask的对象作为参数传递到 Thread类的构造器中,创建 Thread对象,并调用 start()
如果对返回值感兴趣,则通过 FutureTask对象的 get()方法获取 Callable中 call()的返回值

三种方式比较:
Thread: 继承方式, 不建议使用, 因为Java是单继承的,继承了Thread就没办法继承其它类了,不够灵活。
Runnable: 实现接口,比Thread类更加灵活,没有单继承的限制。
Callable: Thread和Runnable都是重写的run()方法并且没有返回值,Callable是重写的call()方法并且有返回值并可以借助FutureTask类来判断线程是否已经执行完毕或者取消线程执行。
总结:
当线程不需要返回值时使用Runnable,需要返回值时就使用Callable,一般情况下不直接把线程体代码放到Thread类中,一般通过Thread类来启动线程;
runnable不返回任何值,无法抛出任何checked Exception;callable可以返回一个值,并且可以抛出一个checked Exception。

二、Thread类中start和run方法的区别
1.start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。然后通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,run方法运行结束,此线程终止。然后CPU再调度其他线程。
2.run()方法当做普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可以继续执行下面的代码;程序中只有主线程—这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的

三、线程的状态
创建(new)状态: 准备好了一个多线程的对象,即执行了new Thread(); 创建完成后就需要为线程分配内存
就绪(runnable)状态: 调用了start()方法, 等待CPU进行调度
运行(running)状态: 执行run()方法
阻塞(blocked)状态: 暂时停止执行线程,将线程挂起(sleep()、wait()、join()、没有获取到锁都会使线程阻塞), 可能将资源交给其它线程使用
死亡(terminated)状态: 线程销毁(正常执行完毕、发生异常或者被打断interrupt()都会导致线程终止)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值