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

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

  本文给大家带来一些java的相关知识,包括实现多线程的四种方式,包括继承Thread类,通过FutureTask包装器实现可调用接口创建线程Thread,使用ExecutorService,Callable,Future实现多线程并返回结果等。来看看吧,希望对你有帮助。

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

  Java多线程实现方式主要有四种类型:

  继承线程类并实现Runnable接口

  实现可调用接口,通过FutureTask包装器创建线程Thread。

  使用ExecutorService,可调用

  Future实现多线程并返回结果。

  前两个方法在线程执行后没有返回值,后两个方法有返回值。

  

一、四种方式实现多线程

  

1、继承Thread类创建线程

  线程类本质上是一个实现Runnable接口的实例,代表一个线程的实例。启动线程的唯一方法是通过Thread类的start()实例方法。start()方法是一个本机方法,它将启动一个新线程并执行run()方法。这样实现多线程非常简单。您可以启动一个新线程并执行您自己定义的run()方法,方法是通过您自己的类直接扩展线程并覆盖run()方法。例如:

  公共类MyThread扩展线程{

  公共无效运行(){

  system . out . println( myth read . run());

  }

  }

  MyThread MyThread 1=new MyThread();

  MyThread MyThread 2=new MyThread();

  mythread 1 . start();

  mythread 2 . start();

2、实现Runnable接口创建线程

  如果您的类已经扩展了另一个类,则不能直接扩展线程。此时,您可以实现一个Runnable接口,如下所示:

  公共类MyThread扩展OtherClass实现Runnable {

  公共无效运行(){

  system . out . println( myth read . run());

  }

  }为了启动MyThread,您需要首先实例化一个线程,并传入您自己的MyThread实例:

  MyThread MyThread=new MyThread();

  Thread thread=新线程(myThread);

  thread . start();事实上,当一个可运行的目标参数传递给Thread时,Thread的run()方法会调用target.run()。参考JDK源代码:

  公共无效运行(){

  如果(目标!=null) {

  target . run();

  }

  }

3、实现Callable接口通过FutureTask包装器来创建Thread线程

  可调用接口(且只有一个方法)定义如下:

  公共接口CallableV {

  V call()抛出异常;}

  公共类SomeCallableV扩展OtherClass实现CallableV {

  @覆盖

  公共V调用()引发异常{

  //TODO自动生成的方法存根

  返回null

  }

  } CallableV one callable=new some CallableV();

  //通过CallableInteger创建FutureTaskInteger对象:

  FutureTaskV oneTask=新FutureTaskV(one callable);

  //注意:FutureTaskInteger是一个包装器,通过接受CallableInteger来创建。它实现了未来的和可运行的接口。

  //通过FutureTaskInteger创建一个线程对象:

  Thread oneThread=新线程(one task);

  one thread . start();//此时,创建了一个线程。

4、使用ExecutorService、Callable、Future实现有返回结果的线程

   ExecutorService、Callable和Future接口都属于Executor的框架。返回结果的线程是JDK1.5中引入的新特性,有了这个特性,就不需要大费周章地获取返回值了。而你自己意识到的话,可能漏洞百出。

  可以返回值的任务必须实现可调用接口。类似地,没有返回值的任务必须实现Runnable接口。

  可调用任务执行后,可以得到一个Future对象,在这个对象上调用get就可以得到可调用任务返回的对象。

  注意:get方法被阻塞,即线程不返回结果,get方法会一直等待。

  结合线程池接口ExecutorService,可以实现传说中的返回结果的多线程。

  下面提供一个完整的多线程测试示例,并返回结果,在JDK1.5下验证后可以直接使用,代码如下:

  导入Java . util . concurrent . *;

  导入Java . util . date;

  导入Java . util . list;

  导入Java . util . ArrayList;

  /**

  *具有返回值的线程

  */

  @SuppressWarnings(未选中)

  公共类测试{

  公共静态void main(String[] args)引发执行异常,

  中断的异常{

  System.out.println( -程序开始运行- );

  日期日期1=新日期();

  int taskSize=5;

  //创建一个线程池

  执行者服务池=执行者。newfixedthreadpool(taskSize);

  //创建多个有返回值的任务

  list future list=new ArrayList future();

  for(int I=0;I任务大小i ) {

  callable c=new my callable(I );

  //执行任务并获取将来的对象

  未来f=池。提交(c);

  //系统。出去。println( f . get().toString());

  列表。添加(f);

  }

  //关闭线程池

  游泳池。关闭();

  //获取所有并发任务的运行结果

  对于(未来女:列表){

  //从将来的对象上获取任务的返回值,并输出到控制台

  系统。出去。println( f . get().toString());

  }

  日期日期2=新日期();

  System.out.println( -程序结束运行- ,程序运行时间【

   date2.getTime() - date1.getTime()毫秒】);

  }

  }

  MyCallable类实现CallableObject {

  私有字符串taskNum

  MyCallable(String taskNum) {

  这个。任务编号=任务编号;

  }

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

  系统。出去。println( taskNum 任务启动);

  日期日期1=新日期();

  线程。睡眠(1000);

  日期日期Tmp2=新日期();

  长时间=日期tmp 2。gettime()-date tmp 1。gettime();

  系统。出去。println( taskNum 任务终止);

   return taskNum 任务返回运行结果,当前任务时间【时间毫秒】;

  }

  }

二、多线程相关知识

  

1.Runnable 和 Callable 的区别?

  

2. 如何启动一个新线程、调用 start 和 run 方法的区别?

  

3.线程相关的基本方法?

  

5.wait()和 sleep()的区别?

  

6.多线程原理

  推荐学习: 《java视频教程》 以上就是爪哇实现多线程的四种方式的详细内容,更多请关注我们其它相关文章!

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

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