java线程有三种创建方式有三种分别是:继承Thread类,实现Runnable接口,实现Callable<V>接口。
1.继承Thread类
继承Thread类创建线程主要是通过覆写父类中的run()方法来实现自己的线程的业务实现逻辑,例如下面的代码 的功能就是创建一个线程并输出一段话"hello world !"。
package com.java.base; //创建方式一: //继承Thread类,覆 写Thread中的run()方法 class MyThread extends Thread{ @Override public void run() { //实现自己的业务逻辑 。例如输出一个 hello world ! System.out.println("hello world !"); } } public class ThreadDemo { public static void main(String[] args) { new MyThread().start(); } }2.实现Runnable接口 由于java的单继承程序结构限制,一个类一旦继承了Thread类以后,将无法继承其他的类,为了回避这样一种单继承的局限性,我们用实现Runnable接口的方式来创建线程,使用接口来创建线程,是程序在结构上更加的面向对象。 package com.java.base; //方式二:实现Runnable接口 class MyRunner implements Runnable { @Override public void run() { // 实现自己的业务逻辑 。例如输出一个 hello world ! System.out.println("hello world !"); } } public class ThreadDemo { public static void main(String[] args) { // 使用Thread类来执行我们定义的线程实例 new Thread(new MyRunner()).start(); } } 3.实现Callable<V>接口创建有返回值的线程。 实现Callable<V>接口创建线程要比请两种方式复杂一些,查看API文档后发现,要想通过Callable<V>接口创建线程,需要 public class FutureTask<V>extends Object implements RunnableFuture<V> 这个类包装后使用Thread类来创建。在使用Callable<V>接口创建的线程,在线程执行完成后可以给执行的程序一个返回值,怎样来创建这个线程和接收线程的返回值呢,通过观察RunnableFuture<V>接口的继承关系发现 public interface RunnableFuture<V> extends Runnable, Future<V> 这个类实现了Runnable接口 和 Future<V> 接口,Runnable接口定义了run()方法,Future<V>接口中有一个V get()throws InterruptedException,ExecutionException方法,通过此方法可以获得线程运行后的返回值。 package com.java.base; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; //方式三:实现Callable<V>接口 class MyCallable implements Callable<String> { @Override public String call() throws Exception { //实现自己的业务逻辑 System.out.println("hello world !"); return "我已经执行完毕"; } } public class ThreadDemo { public static void main(String[] args) throws Exception { MyCallable myThread = new MyCallable(); FutureTask<String> task = new FutureTask<String>(myThread); new Thread(task).start(); System.out.println("线程运行结束后返回值:"+task.get()); } } 程序输出:
hello world ! 线程运行结束后返回值:我已经执行完毕