Java多线程的使用有三种方法总结:

继承Thread类

实现Runnable接口

和使用Callable和Future创建线程

本文将对这三种方法一一进行介绍。

1、继承Thread类


public class MyThread extends Thread {
    @Override
    public void run(){
        super.run();
        System.out.println("执行子线程...");
    }
}
public class Test {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        System.out.println("主线程...");
    }
}

2、实现Runnable接口


public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("执行子线程...");
    }
}
public class Test {
    public static void main(String[] args) {

        Runnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
        System.out.println("主线程运行结束!");
    }
}

3、使用Callable和Future创建线程

import java.util.concurrent.Callable;

public class MyCallable implements Callable {
    int i = 0;
    @Override
    public Object call() throws Exception {
        System.out.println(Thread.currentThread().getName()+"  i的值:"+ i);
        return i++; //call方法可以有返回值
    }
}
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class Test {
    public static void main(String[] args) {
        Callable callable = new MyCallable();
        for (int i = 0; i < 10; i++) {
            FutureTask task = new FutureTask(callable);
            new Thread(task,"子线程"+ i).start();
            try {
                //获取子线程的返回值
                System.out.println("子线程返回值:"+task.get() + "\n");
            }  catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

5、三种方式的对比

第一种和后面两种的对比:

1、通过代码可以看出,第一种方法是最简洁方便的,直接就可以start,不需要任何转换
2、但是第一种有一个很不好的地方就是继承了Thread类后由于java的单继承机制,就不可以继承其他的类了,而如果实现的是接口,就可以实现多个接口,使开发更灵活。

第二种和第三种方式对比:

1、同样的,第二种方法相对第三种方式来说代码更简洁,使用更方便,少了一次转换
2、第三种方法有两个优点:有返回值等待执行结果、可以抛出异常

总结:

第一种和第二种,都是对run方法进行重写或实现,并且都是线程异步

第三种实现call方法,并且子线程异步主线程同步等待结果集

补充

在java1.8中使用Lambda可以轻松实现一个线程

new Thread(()-> 
       EmailUtil.sendWorkbookGropBuy(gropBuyService.creatGropBuy(businessId,cardId ,userId         
       ,count),user.getEmail())
).start();