多线程-Thread、Runnable、Callbale、Future

Thread:java使用Thread代表线程,所有的线程对象都必须是Thread类或其子类,可以通过继承Thread类来创建并启动多线程。

package org.github.lujiango;

public class Test10 {

    static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("I am extend Thread...");
        }
    }

    public static void main(String[] args) {
        MyThread mt = new MyThread();
        mt.start();
    }

}

  

Runnbale:可以通过实现Runnable接口来创建多线程,创建Runnable实现类的实例,并以此作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

package org.github.lujiango;

public class Test11 {

    static class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println("I am implement Runnable...");
        }
    }

    public static void main(String[] args) {
        Thread t = new Thread(new MyRunnable());
        t.start();
    }

}

  

Callable:从Java 5开始,Java提供了Callable接口,提供了一个call方法可以作为线程执行体,但是call方法可以有返回值,可以声明抛出异常。Java5提供了Future接口来代表call方法的返回值,并为Future提供了一个FutureTask实现类,该实现类实现了Future和Runnable。

package org.github.lujiango;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Test12 {

    static class MyCallable implements Callable<String> {
        @Override
        public String call() throws Exception {
            return "my callable";
        }
    }

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        MyCallable callable = new MyCallable();
        FutureTask<String> future = new FutureTask<String>(callable);
        new Thread(future).start();
        System.out.println(future.get());

    }

}

创建线程的三种方式比较:

通过继承Thread类或实现Runnable,Callable接口都可以实现多线程。 
采用Runnable,Callable接口的方式创建多线程 
(1)线程类只是实现了Runnable接口或Callable接口,还可以继承其它类。 
(2)多线程可以共享一个target对象,所以合适多个相同线程来处理同一份资源的情况,从而可以将CPU,代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。 
(3)编程稍微复杂,如果需要访问当前线程,则必须使用Thread.currentThread()方法 
采用继承Thread类的方法创建多线程 
(1)因为多线程类已经继承了Thread类,所以不能在继承其它父类。 
(2)编写简单,如果需要访问当前线程,则无须使用Thread.currentThread()方法,直接使用this即可获得当前线程。

 
 
原文地址:https://www.cnblogs.com/lujiango/p/7581003.html