使用多线程的目的只有一个,那就是为了能更好的利用CPU的资源。所以在Java中也必须有多线程,在学习多线程的过程中认识了三种方法实现多线程。
1.继承Thread这个类,重写run方法。
2.实现Runnable接口,实现run方法。(Thread是Runnable的实现类)
(以上两种方法都 无法抛出异常 不拥有返回值)
3.实现Callable接口,实现call方法。(这个方法可对外抛出异常和拥有返回值)
首先说最简单的第一种方法。
一、继承Thread类
在一个类直接继承Thread,重写run方法,该例子是取钱,每次取1000块,取完跳出循环。
想要多个线程,只要在线一个类继承Thread,重写run方法,在main方法实例该类,调用该线程。
二、实现Runnable接口,实现run方法。
这里例子也是取钱,但对于上一个例子,这次的钱是共享的。
输出结果如右图:
这只是举例有这两种方法,其实Thread也可以实现资源共享,因为Thread本来就是实现了Runnable,包含Runnable的功能是很正常。
(知乎里所说的)两者的真正区别最主要的就是一个是继承,一个是实现;其他还有一些面向对象的思想,Runnable就相当于一个作业,而Thread才是真正的处理线程,我们需要的只是定义这个作业,然后将作业交给线程去处理,这样就达到了松耦合,也符合面向对象里面组合的使用,另外也节省了函数开销,继承Thread的同时,不仅拥有了作业的方法run(),还继承了其他所有的方法。综合来看,用Runnable比Thread好的多。
最后一种:Callable
下面的例子是以直播间的访问人数为例子:
最后的输出结果是:
Runnable和Callable的区别
(1) Callable规定的方法是 call(), Runnable规定的方法是 run()。
(2) Callable的任务执行后可返回值,而 Runnable的任务是不能返回值。
(3) call方法可以抛出异常, run方法不可以。
(4)运行 Callable任务可以拿到一个 Future对象
在实现接口时,Callable后又对尖括号中间还有个T,如:,这就是泛型,里面尖括号填写你的返回值的类型:
如:
在实现call方法时,返回值的类型也要一样,如:
编辑整理 丨刘蕊