java中实现多线程的几种方式

互联网 19-12-4

Java多线程的使用有三种方法:继承Thread类、实现Runnable接口和使用Callable和Future创建线程。

一、继承Thread类

实现方式很简单,只需要创建一个类去继承Thread类然后重写run方法,在main方法中调用该类实例对象的start方法即可实现多线程并发。代码:

public class MyThread extends Thread {     @Override     public void run(){                 super.run();         System.out.println("执行子线程...");     } }

测试用例:

public class Test {     public static void main(String[] args) {         MyThread myThread = new MyThread();         myThread.start();         System.out.println("主线程...");     } }

运行结果:

当然,这里的结果不代表线程的执行顺序,线程是并发执行的,如果多运行几次,打印顺序可能会不一样。多线程的运行过程中,CPU是以不确定的方式去执行线程的,故运行结果与代码的执行顺序或者调用顺序无关,运行结果也可能不一样。

免费视频教程推荐:java学习视频

这里还有一个需要注意的点就是main方法中应该调用的是myThread的start方法,而不是run()方法。调用start()方法是告诉CPU此线程已经准备就绪可以执行,进而系统有时间就会来执行其run()方法。

而直接调用run()方法,则不是异步执行,而是等同于调用函数般按顺序同步执行,这就失去了多线程的意义了。

二、实现Runnable接口

这种方式的实现也很简单,就是把继承Thread类改为实现Runnable接口。代码如下:

public class MyRunnable implements Runnable {         @Override     public void run() {         System.out.println("执行子线程...");     } }

测试用例:

public class Test {         public static void main(String[] args) {         Runnable runnable = new MyRunnable();         Thread thread = new Thread(runnable);         thread.start();         System.out.println("主线程运行结束!");     } }

运行结果:

运行结果没啥好说的,这里main中可以看到真正创建新线程还是通过Thread创建:

Thread thread = new Thread(runnable);

这一步Thread类的作用就是把run()方法包装成线程执行体,然后依然通过start去告诉系统这个线程已经准备好了可以安排执行。

三、使用Callable和Future创建线程

上面的两种方式都有这两个问题:

1、无法获取子线程的返回值;

2、run方法不可以抛出异常。

为了解决这两个问题,我们就需要用到Callable这个接口了。说到接口,上面的Runnable接口实现类实例是作为Thread类的构造函数的参数传入的,之后通过Thread的start执行run方法中的内容。但是Callable并不是Runnable的子接口,是个全新的接口,它的实例不能直接传入给Thread构造,所以需要另一个接口来转换一下。

Java5提供了Future接口来代表Callable接口里call()方法的返回值,并为Future接口提供了一个实现类FutureTask,该实现类的继承关系如图所示:

可以看到,该实现类不仅实现了Future接口,还实现了Runnable接口,所以可以直接传给Thread构造函数。

而关于FutureTask的构造函数如下:

所以这里面其实就是要比上一个方法再多一个转换过程,最终一样是通过Thread的start来创建新线程。有了这个思路,代码就很容易理解了:

import java.util.concurrent.Callable; public class MyCallable implements Callable {     int i = 0;     @Override     public Object call() throws Exception {         System.out.println(Thread.currentThread().getName()+"  i的值:"+ i);                 return i++; //call方法可以有返回值     } }

测试:

import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class Test {     public static void main(String[] args) {         Callable callable = new MyCallable();                 for (int i = 0; i < 10; i++) {             FutureTask task = new FutureTask(callable);                         new Thread(task,"子线程"+ i).start();                         try {                //获取子线程的返回值                 System.out.println("子线程返回值:"+task.get() + "\n");             }  catch (Exception e) {                 e.printStackTrace();             }         }     } }

执行结果(部分):

相关文章教程推荐:java入门程序

以上就是java中实现多线程的几种方式的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 方式
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:phpmyadmin怎么删除数据表中的数据

相关资讯