目录
Java的线程模型
- Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例
- 线程用于完成一定的任务(执行一段程序流), Java使用线程执行体来代表这段程序流
- 线程的使用过程:定义线程体》创建线程对象》调用线程对象的方法以启动线程
创建线程对象只有一种方式,但定义线程执行体有多种方式
线程的创建方式
- 继承Thread类,重写run()方法
-
定义Thread类的子类,并重写该类的run()方法(线程体)
- 创建Thread类的子类的实例。即创建线程对象
-
调用线程对象的start()方法,即启动这个线程
-
-
实现Runnable接口,重写run()方法
class Foo implements Runnable{ public void run(){ ... } } public static void main(String[] args){ new Thread(new Foo()).start(); }
-
定义Runnable接口的实现类,并实现该接口的run()方法(线程体)。
-
创建Runnable实现类的实例,并以此作为target来创建Thread对象。
-
调用Thread对象的start()方法来启动线程。
-
-
实现Callable接口(线程可以有返回值)
class Foo implements Callable<String>{ public String call() throws Exception{ ... } } public static void main(String[] args){ FutureTask<String> task = new FutureTask<>(new Foo()); new Thread(task).start(); System.out.println(task.get()); }
-
定义Callable接口的实现类,并实现该接口的cal1()方法(线程体,类似于Runnable中的run()方法);
-
创建Callable接口的实例,并使用Future接口来包装Callable对象,最后使用Future对象(线程的返回值)作为target来创建Thread对象
-
调用Thread对象的start()方法来启动线程;
-
调用Future对象的get()方法获取线程的返回值。
-
三种方式的比较
继承父类的方式
- -优点∶编程比较简单;
- -缺点∶线程类已经继承了Thread类,所以不能再继承其他的父类;受限制了,让类丧失了灵活性
实现接口的方式
- -优点∶线程类只实现了接口,还可以继承于其他的父类;可以更灵活
- -缺点∶编程比较麻烦;