多线程-Thread,Runnable,Callable,Future,RunnableFuture,FutureTask

类图:

先看各自的源码:

public interface Runnable {
    public abstract void run();
}

  

public
class Thread implements Runnable {
    /* What will be run. */
    private Runnable target;
}

Thread与Runnable其实是一个装饰器模式。

public interface Callable<V> {
    V call() throws Exception;
}

  

public interface Future<V> {
    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

  

public interface RunnableFuture<V> extends Runnable, Future<V> {
    void run();
}

  

public class FutureTask<V> implements RunnableFuture<V> {
 /** The underlying callable; nulled out after running */
    private Callable<V> callable;
 /** The result to return or exception to throw from get() */
    private Object outcome;
    public void run() {
        if (state != NEW ||
            !UNSAFE.compareAndSwapObject(this, runnerOffset,
                                         null, Thread.currentThread()))
            return;
        try {
            Callable<V> c = callable;
            if (c != null && state == NEW) {
                V result;
                boolean ran;
                try {
                    result = c.call();
                    ran = true;
                } catch (Throwable ex) {
                    result = null;
                    ran = false;
                    setException(ex);
                }
                if (ran)
                    set(result);
            }
        } finally {
            // runner must be non-null until state is settled to
            // prevent concurrent calls to run()
            runner = null;
            // state must be re-read after nulling runner to prevent
            // leaked interrupts
            int s = state;
            if (s >= INTERRUPTING)
                handlePossibleCancellationInterrupt(s);
        }
    }
}

从类的结构来看: 
Runnable,Callable,Future接口本是互相独立的,没有直接的关系。 
而Thread的一系列构造函数需要的是Runnable对象,所以Callable对象并不适合Thread构造函数,而是借助于FutureTask这个类,该类实现具有Future和Runnable接口能力的类,同时组合Callable对象,FutureTask在run()方法中调用Callable的call()方法,这是个典型的适配器模式: 
Runable是个目标接口,定义了Thread所需的接口; 
Callable是被适配接口,定义了一个已经存在的接口方法call() 
FutureTask是个适配器类,作为一个转换器,将Runnable和Callable适配,适配器类是适配器模式的核心,它通过实现RunnableFuture和组合Callable使得两者产生关系。

时间: 2024-10-25 18:32:38

多线程-Thread,Runnable,Callable,Future,RunnableFuture,FutureTask的相关文章

java多线程创建-Thread,Runnable,callable和threadpool

java创建多线程的方式有许多种,这里简要做个梳理 1. 继承Thread类 继承java.lang.Thread类,创建本地多线程的类,重载run()方法,调用Thread的方法启动线程.示例代码如下: MyThread.java public class MyThread extends Thread { public void run(){ private int copy = 0; System.out.println("Thread id:" + Thread.current

java 线程 --- Thread,Runnable,Callable 基础学习

java 使用 Thread 类代表线程,所有现场对象都必须是 Thread 类或者其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流.java 使用线程执行体来代表这段程序流. 1.继承Thread 类创建线程 启动多线程的步骤如下: (1)定义Thread 类的子类,并重写该类的run() 方法,该run() 方法的方法体就代表类线程需要完成的任务.因此把run() 方法称为线程执行体. (2)创建 Thread 子类的实例,即创建线程对象. (3)调用线程的star()

java 多线程--- Thread Runnable Executors

java 实现多线程的整理: Thread实现多线程的两种方式: (1)继承 Thread类,同时重载 run 方法: class PrimeThread extends Thread { long minPrime; primeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime } } PrimeThread p = new

[java多线程] - Thread&amp;Runnable运用

负载是一个很大的话题,也是一个非常重要的话题.不管是在大的互联网软件中,还是在一般的小型软件,都对负载有一定的要求,负载过高会导致服务器压力过大:负载过低又比较浪费服务器资源,而且当高请求的时候还可能出现低效率的问题.多线程就是一种提高服务效率的方式.面对海量的用户请求,单线程肯定扛不住,那么多线程的需求也就应运而生,所以说掌握多线程的开发技术对于技术人员来说肯定是非常重要的.参考文档http://docs.oracle.com/javase/7/docs/api/. 一.Runnable使用

Java多线程-Thread&amp;Runnable的关系

Thread创建多线程: MyThread.class package com.test.interview; public class MyThread extends Thread { private String name; public MyThread(String name) { this.name = name; } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("

java多线程(thread/runnable)

1 class Thread1 extends Thread Thread1 mTh1=new Thread1("A"); Thread1 mTh2=new Thread1("B"); mTh1.start(); mTh2.start(); 2 class Thread2 implements Runnable new Thread(new Thread2("C")).start(); new Thread(new Thread2("D

Android进阶——多线程系列之Thread、Runnable、Callable、Future、FutureTask

多线程系列之Thread.Runnable.Callable.Future.FutureTask 前言 多线程一直是初学者最抵触的东西,如果你想进阶的话,那必须闯过这道难关,特别是多线程中Thread.Runnable.Callable.Future.FutureTask这几个类往往是初学者容易搞混的.这里先总结这几个类特点和区别,让大家带着模糊印象来学习这篇文章 Thread.Runnable.Callable:都是线程 Thread特点:提供了线程等待.线程睡眠.线程礼让等操作 Runnab

Runnable,Callable,Thread,Future,FutureTask关系

1.Runnable和Callable的区别是: (1)Callable规定的方法是call(),Runnable规定的方法是run(). (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得 (3)call方法可以抛出异常,run方法不可以 (4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果.它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果.通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果.

Java中的Runnable、Callable、Future、FutureTask的区别与示例

Java中存在Runnable.Callable.Future.FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别. Runnable 其中Runnable应该是我们最熟悉的接口,它只有一个run()函数,用于将耗时操作写在其中,该函数没有返回值.然后使用某个线程去执行该runnable即可实现多线程,Thread类在调用start()函数后就是执行的是Runnable的run()函数.Runnable的声明如下