龙空技术网

java面试:如何实现java多线程?#编程

云端行笔 34

前言:

目前看官们对“java如何实现多线程”大约比较讲究,朋友们都想要剖析一些“java如何实现多线程”的相关知识。那么小编也在网上搜集了一些关于“java如何实现多线程””的相关资讯,希望朋友们能喜欢,同学们快快来学习一下吧!

如何实现Java多线程?Java虚拟机允许应用程序并发地运行多个线程。在Java语言中实现多线程的方式有以下几种:实现Runnable接口并实现该结构的run方法;继承Thread类重写run方法;实现Callable接口重写call方法,其中前两种更为常用一些。

先来看下继承Thread类的实现方式:Thread本质上是实现了Runnable接口的一个实例,它代表一个线程的实例,并且启动新的线程的唯一方法,就是通过Thread类的start()方法。start方法是一个本地方法,它启动一个新的线程并执行run()方法,即执行自己重写的Thread类的run方法,也就是右图打印输出那行代码。

另外有一点需要注意,调用start()方法并不是执行多线程代码,而是使得该线程变为可运行态。什么时候运行多线程代码由操作系统决定?再来看下实现Runnable接口的方式。结合右侧代码看下其流程:

·首先自定义一个MyThread类来实现Runnable接口,并实现其run()方法;

·然后也是创建一个Thread对象,用实现Runnable接口的对象即myThread。作为参数实例化该Thread对象。

·最后调用Thread的start()方法。

从代码中可以看到,其实不管是继承Thread类,还是实现Runnable接口,最终都是通过Thread类的API来控制线程的。实际开发过程中实现多线程时,一般推荐使用Runnable接口的方式。因为Thread类定义了多种方法可以被派生类使用或重写,但是只有run()方法必须被重写。

而很多时候继承一个类是为了去加强和修改这个类才去继承的,因此如果没有必要重写Thread类中的其他方法,那么通过继承Thread类和实现Runnable接口的效果是完全相同的,这样最好还是使用Runnable接口来创建线程。

另外细心的同学可能会注意到右侧的代码中,thread的启动并不是执行的start方式而是run"。其实这样是不对的。

接下来详细的分析一下,一个Java线程的创建本质上就对应了一个本地线程的创建,两者是一一对应的。

·thread执行start方法后调用native方法start0创建本地线程,然后利用cpp底层去调用当前线程类的run方法。

·然后再来看run方法的实现,可以看到run方法只是类的一个普通方法。直接调用run方法启动线程并不能真正实现多线程运行,因为程序执行路径只有一条,且需要等待run方法体执行完毕才能继续执行后续代码,这样就无法充分利用多核处理器的优势。因此,使用start方法才能真正实现多线程运行。

除了start方法,还可以使用Callable接口实现多线程。Callable接口是美帝or框架中的功能类,提供了比Runnable更强大的功能。与Runnable接口类似,Callable接口也可以用于启动线程,但它还提供了比Runnable更丰富的功能,主要体现在以下三点:

·Callable可以在任务结束时返回一个结果。Runnable则无法提供该功能。

·Callable中的call方法可以抛出异常,而Runnable中的run方法则不能。通过运行Callable可以获取一个Future对象,Future对象可以用于监控目标线程的状态,并获取异步计算的结果。

由于线程输入异步计算模型,因此无法从别的线程中获取函数的返回值。在这种情况下,可以使用Future对象来监控目标线程,并在需要时获取计算结果。

以上是关于Java多线程的内容,欢迎大家留言交流。

标签: #java如何实现多线程 #java如何实现多线程的运行