java中实现多线程的两种方式,java实现多线程的三种方法

  java中实现多线程的两种方式,java实现多线程的三种方法

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

  一、继承Thread类

  实现非常简单。你只需要创建一个类来继承Thread类,然后重写run方法。通过调用main方法中类实例对象的start方法,可以实现多线程并发。代码:

  公共类MyThread扩展线程{

  @覆盖

  公共无效运行(){

  super . run();

  System.out.println(执行子线程.);

  }

  }测试案例:

  公共类测试{

  公共静态void main(String[] args) {

  MyThread MyThread=new MyThread();

  myth read . start();

  System.out.println(主线程.);

  }

  }运行结果:

  如何解决写爬虫IP受阻的问题?立即使用。

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

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

  这里需要注意的另一点是,main方法应该调用myThread的start方法,而不是run()方法。调用start()方法告诉CPU这个线程已经可以执行了,然后系统有时间就会执行它的run()方法。

  但是直接调用run()方法不是异步的,而是像调用函数一样按顺序同步,失去了多线程的意义。

  二、实现Runnable接口

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

  公共类MyRunnable实现Runnable {

  @覆盖

  公共无效运行(){

  System.out.println(执行子线程.);

  }

  }测试案例:

  公共类测试{

  公共静态void main(String[] args) {

  runnable runnable=new my runnable();

  Thread thread=新线程(runnable);

  thread . start();

  System.out.println(主线程完成了!);

  }

  }运行结果:

  运行结果没什么好说的。在这里,您可以看到新线程是实际创建的还是通过main中的Thread创建的:

  Thread thread=新线程(runnable);在这一步中,Thread类的作用是将run()方法包装成一个线程执行器,然后仍然通过start告诉系统该线程已经准备好被调度执行。

  三、使用Callable和Future创建线程

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

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

  2.run方法不能引发异常。

  为了解决这两个问题,我们需要使用可调用接口。说到接口,上面的runnable接口实现类实例作为Thread类的构造函数的参数传入,然后通过Thread的启动执行Run方法中的内容。但是,Callable不是Runnable的子接口,而是一个全新的接口。它的实例不能直接传入线程结构,所以需要另一个接口进行转换。

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

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

  关于FutureTask的构造函数如下:

  所以实际上比前面的方法多了一个转换过程,最后通过Thread的开始创建一个新的线程。有了这个想法,代码就容易理解了:

  导入Java . util . concurrent . callable;

  公共类MyCallable实现Callable {

  int I=0;

  @覆盖

  公共对象调用()引发异常{

  system . out . println(thread . current thread()的值。getname() I: I);

  返回I;//调用方法可以有返回值

  }

  }测试:

  导入Java . util . concurrent . callable;

  导入Java . util . concurrent . future task;

  公共类测试{

  公共静态void main(String[] args) {

  callable callable=new my callable();

  for(int I=0;i 10i ) {

  FutureTask task=new FutureTask(可调用);

  新线程(任务,“子线程”I)。start();

  Try {//获取子线程的返回值

  System.out.println(子线程返回值: task . get() \ n );

  } catch(异常e) {

  e . printstacktrace();

  }

  }

  }

  }执行结果(部分):

  相关文章教程推荐:java入门程序以上是java中实现多线程的几种方式的细节。请多关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: