龙空技术网

面试问题之多线程两种实现方式及区别「Java多线程实践-附代码」

程序猿的花果山 1647

前言:

目前姐妹们对“多线程三种实现方式的区别”大约比较关注,各位老铁们都想要学习一些“多线程三种实现方式的区别”的相关资讯。那么小编在网摘上网罗了一些有关“多线程三种实现方式的区别””的相关文章,希望你们能喜欢,我们一起来了解一下吧!

前沿

前段时间面试新员工,问了这个比较基础的问题,但是发现很多求职者虽然了解实现方式,但是具体往下问细节的时候就会卡壳了。

这里用实例给大家做下讲解。

众所周知,JAVA中有两种实现多线程的方式,一种是直接继承Thread类,另一种是实现Runnable接口。

下面引出以下两个问题:

1.在实际使用过程中用哪种比较好呢?

2.两种实现方式在应用上有什么区别?

为了解答这两个问题,我们用一段代码实践来分析。

首先我们使用代码来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100张车票,一个售票点占用一个线程。

我们首先这样编写代码:

代码块1

Main测试类:

代码块2

在上面这个实现中,用继承Thread的方式实现,用ThreadTest类模拟售票处的售票方式,在Run方法中每执行一次票数减少1张,模拟出票,同时打印票号,直到余票为零。 在main方法中,创建一个线程对象,重复启动四次,从而实现四个线程的启动。但是从实际的结果看,其实依然只有一个线程在运行。

结论:一个线程对象只能启动一个线程,无论调用多少次Start方法。

接下来我们将Main测试类,改成以下实现:

代码块3

从运行结果看,没个票号都被打印了四次,即四个线程在各自卖自己的100张票,而没有去卖共同的100张票。这种情况的出现,是因为我们创建了四个线程去处理各自的资源,而没有做到多个线程去处理相同的资源。

接下来我们继续修改Main测试类:

代码块4

从打印结果可以看出,我们实现了四个线程去卖共同的100张票。这种实现就是只创建了一个资源对象,再去创建四个线程,把创建的资源对象分配给四个线程。

到这里我们就把这个小实例展现完了。

总结

实现Runnable接口与继承Thread类实现多线程的区别:

(1)适合多个相同程序代码的线程去处理同一资源的情况;

(2)可以避免由于Java的单继承特性带来的局限。我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了。

(3)有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。

标签: #多线程三种实现方式的区别 #多线程三种实现方式的区别和联系