Thread类
1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体。
2. 创建Thread子类的实例,即创建了线程对象
3. 调用线程对象的start()方法来启动该线程
Runable接口
1、实现类实现Runable接口,重新run方法
2、new Runable接口的实现类对象,将实现类对象作为线程对象的入参新建Thread类线程对象
3、调用线程对象的start()方法来启动该线程
Callable接口
实现 Callable 接口创建线程需要借助 FutureTask 类和 ExecutorService 线程池来启动线程。与 Runnable 接口相比,Callable 接口可以返回执行结果,并且支持抛出异常。
MyCallable myCallable = new MyCallable();
FutureTask<String> futureTask = new FutureTask<>(myCallable);
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(futureTask);
String result = futureTask.get();
System.out.println(result);
实现接口相比继承类的好处
1、避免单继承的局限,继承了Thread类就不能继承其他类了。
2、解耦:实现类中重写的run方法可以被多个new的thread实现,代码可以被多个线程共享
3、线程池只支持放入Runable和callable类的线程。