请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

猿媛之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 3571|回复: 0

Java三种多线程实现方式对比

[复制链接]

554

主题

556

帖子

1938

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1938
发表于 2016-1-13 21:51:28 | 显示全部楼层 |阅读模式
   Java虚拟机允许应用程序并发地运行多个线程。在Java语言中,多线程的实现一般有以下三种方法,其中前两种为最常用的方法。
   (1)继承Thread类,重写run方法。
   Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()方法。start()方法是一个native(本地)方法,它将启动一个新线程,并执行run()方法(Thread中提供的run()方法是一个空方法)。这种方式通过自定义直接extendThread,并重写run()方法,就可以启动新线程并执行自己定义的run()方法。需要注意的是,start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行多线程代码是由操作系统决定的。下例给出Thread的使用方法。
  1. class MyThread extends Thread{ //创建线程类
  2.         public void run(){
  3.                 System.out.println("Thread body"); //线程的函数体
  4.         }
  5. }

  6. public class Test {               
  7.         public static void main(String[] args){
  8.                 MyThread thread=new MyThread();
  9.                 thread.start();    //开启线程
  10.         }
  11. }
复制代码
2)实现Runnable接口,并实现该接口的run()方法。
  以下是主要步骤:
  a)自定义类并实现Runnable接口,实现run()方法。
  b)创建Thread对象,用实现Runnable接口的对象作为参数实例化该Thread对象。

  c)调用Thread的start()方法。
  1. class MyThread implements Runnable{ //创建线程类
  2.         public void run(){
  3.                 System.out.println("Thread body");
  4.         }
  5. }

  6. public class Test {               
  7.         public static void main(String[] args){
  8.                 MyThread thread=new MyThread();
  9.                 Thread t=new Thread(thread);
  10.                 t.start();  //开启线程
  11.         }
  12. }
复制代码
   其实,不管是通过继承Thread类还是实现Runnable接口来实现多线程的方法,最终还是通过Thread的对象的API来控制线程的。
   (3)实现Callable接口,重写call()方法。
    Callable对象实际是属于Executor框架中的功能类,Callable接口与Runnable接口类似,但是提供了比Runnable更强大的功能,主要表现为以下三点:
    a)Callable可以在任务结束后提供一个返回值,Runnable无法提供这个功能。
    b)Callable中的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常。

    c)运行Callable可以拿到一个Future对象,Future对象表示异步计算的结果。它提供了检查计算是否完成的方法。由于线程属于异步计算模型,所以无法从别的线程中得到函数的返回值,在这种情况下,就可以使用Future来监视目标线程调用call()方法的情况,当调用Future的get()方法以获取结果时,当前线程就会阻塞,直到call()方法结束返回结果。
  1. import Java.util.concurrent.*;  
  2.   
  3. public class CallableAndFuture {  
  4.   //创建线程类
  5.         public static class CallableTest implements Callable<String>{
  6.                 public String call() throws Exception{
  7.                         return "Hello World!";      
  8.                 }
  9.         }

  10.     public static void main(String[] args) {  
  11.       ExecutorService threadPool = Executors.newSingleThreadExecutor();
  12.       //启动线程
  13.       Future<String> future = threadPool.submit(new CallableTest());
  14.       try {  
  15.           System.out.println("waiting thread to finish");  
  16.           System.out.println(future.get()); //等待线程结束,并获取返回结果
  17.       } catch (Exception e) {  
  18.           e.printStackTrace();  
  19.       }
  20.     }  
  21.   }  
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|猿媛之家    

GMT+8, 2020-2-28 13:42 , Processed in 0.182395 second(s), 33 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表