线程的三种实现方式详解

一     继承thread类

1. 定义Thread的子类,重写run()方法,run()方法称为线程执行体

2. 创建Thread子类的实例

3. 调用线程对象的start()方法启动线程

public class MyThread extends  Thread {
    @Override
    public void run() {
        for (int i=0; i < 3; i++) {
            System.out.println(Thread.currentThread().getName() + " is running " + i);
            }
      }
    public static void main(String[] args) {
        new MyThread().start();
        new MyThread().start();
      }
}

运行结果如下图所示:

 

二:实现runnable接口

1.定义runnable接口的实现类,重写run()方法

2.创建Runnable实现类的实例,丟入到Thread对象

3.调用线程对象的start()方法来启动线程

public class RunnableTest implements Runnable {
    @Override
    public void run() {
        for(int i=0;i<3;i++){
            try {
                Thread.sleep(100);
                System.out.println(Thread.currentThread().getName()+i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        new Thread(new RunnableTest(),"线程1---").start();
        new Thread(new RunnableTest(),"线程2---").start();
      }
}

运行结果如下图所示

 三:实现Callable接口

在Java5之后就开始提供Callable接口,该接口是Runnable接口的增强版,Callable接口提供了一个call()方法作为线程执行体,call()方法可

以有返回值,call()方法可以声明抛出异常。

V get() 返回Call任务里call方法的返回值。调用该方法会造成线程阻塞,必须等待子线程结束后才会得到返回值。

V get(long timeout,TimeUnit unit)返回Call任务里call方法的返回值,该方法限定程序最多阻塞timeout和unit指定的时间,

如果超过指定时间还没有返回值,将会抛出TimeOutException异常

boolean isCancelled()如果在Callable任务正常完成前被取消,则返回true

boolean isDone() 如果Callable任务完成则返回true。

Callable的实现步骤如下:

 1.创建Callable接口的实现类,并实现call方法

 2.使用FutureTask类包装Callable对象

 3.使用FutrueTask对象作为Thread对象的target创建并启动新线程

 4.启用FutrueTask对象的get()方法获得子线程的返回值。

public class CallableDemo implements  Callable<Integer> {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<Integer> futureTask=new FutureTask<Integer>(new CallableDemo());
         new Thread(futureTask).start();
         try {
             System.out.println("线程返回值是"+futureTask.get());
         }catch (Exception e){
             e.printStackTrace();
         }
         if(futureTask.isDone()){
             System.out.println("线程结束");
         }
     }
     @Override
     public Integer call() throws Exception {
        System.out.println("线程开始");
        int sum=0;
        for(int i=0;i<100;i++){
            sum+=i;
        }
        return sum;
     }
}

运行结果如下图所示:

 

posted @ 2019-12-19 21:28  江南大才子  阅读(1664)  评论(0编辑  收藏  举报