不多说,直接上干货!
有4种方式可以用来创建线程:
第一种:继承Thread类,重写run方法
第二种:实现Runnable接口,并实现该接口的run方法(一般我们在编程的时候推荐用这种)
第三种:实现Callable接口,重写run方法
第四种:应用程序可以使用Executor框架来创建线程池
第一种:继承Thread类,重写run方法,不带返回值
继承Thread类(真正意义上的线程类),是Runnable接口的实现。
class MyThread extends Thread public void run() { System.out.println("Thread body");//线程的函数体 } public class Test public static void main(String ] args) { MyThread thread = new MyThread ();
thread.start();//开启线程
}
}
第二种:实现Runnable接口,实现run方法,不带返回值
但是比继承Thread类好用,实现接口还可以继承类,避免了单继承带来的局限性;
一般情况下,常见的是这种。
Runnable接口有如下好处:
①避免点继承的局限,一个类可以继承多个接口。
②适合于资源的共享
实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。
主要步骤如下:
(1)自定义类并实现Runnable接口,实现run方法。
(2)创建Thread对象,用实现Runnable接口的对象作为参数实例化该Thread对象。
(3)调用Thread的start方法。
class MyThread implements Runable { //创建线程类 public void run() { System.out.println("Thread body"); } } public class Test { public static void main(String ] args) { MyThread thread = new MyThread(); Thread t = new Thread(thread); t.start(); //开启线程 } }
第三种:实现callable接口,重写call方法,带返回值
可以获取返回值,缺点是比较繁琐。
Callable接口实际是属于Executor框架中的功能类,Callable接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能。主要如下:
(1)Callable可以在任务结束后提供一个返回值,而Runnable无法提供这个功能。
(2)Callable中的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常。
(3)运行Callable可以拿到一个Future对象,Future对象表示异步计算的结果,它提供了检查计算是否完成的方法。由于线程属于异步计算模型,因此无法从别的线程中得到函数的返回值,在这种情况下,就可以使用Future来监视目标线程调用call()方法的情况。当调用Future的get()方法以获取结果时,当前线程就会阻塞,指导call()方法结束返回结果。
import Java.util.concurrent.*; public class CallableAndFuture { //创建线程类 public static class CallableTest implements Callable <String> { public String call() throws Exception { return "Hello World!"; } } public static void main(String ] args) { ExecutorService threadPool = Executors.newSingleThreadExecutor();//启动线程 Future<String> future = threadPool.submit(new CallableTest()); try { System.out.println("waiting thread to finish"); System.out.println(future.get());//等待线程结束,并获取返回结果 } catch (Exception e) { e.printStackTrace(); }
}
}
第四种:使用实现了Executor接口的ThreadPoolExecutor来创建线程池
用Executor框架来创建,包含了很多并发处理以及线程池的方法。