1 . 继承Thread类创建线程
- 定义Thread类的子类,并重写该类的run() 方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程的执行体
- 创建Thread子类的实例,也就是创建了线程对象
- 启动线程,及调用线程的start()方法
public class MyThread extends Thread{
public void run(){
}
}
public class Main{
public static void main(String[] args){
new MyThread().start();
}
}
2 . 实现Runnable接口创建线程
- 定义Runnable接口的实现类,重写run()方法,这个run()方法和Thread中的run()方法一样是线程的执行体
- 创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread对象才是真正的线程对象
- 通过调用线程对象的start()方法来启动线程
public class MyThread implements Runnable{
public void run(){
}
)
public class Main{
public static void main(String[] args){
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread().start();
}
}
3 . 使用Callable 和 Future创建线程
- 创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例(从java8开始可以直接使用Lambda表达式创建Callable对象)
- 使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值
- 使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口)
- 调用FutureTask对象的get()方法来获取子线程执行结束后的返回值
public class Main{
public static void main(String[] args){
MyThread th = new MyThread();
FutureTask<Integer> future = new FutureTask<Integer>
((Callable<Integer>)()->{
return 5;
}
);
new Thread(task,"有返回值的线程").start();
try{
System.out.println("子线程的返回值:"+future.get());
}catch(Exception e){
ex.printStackTrace();
}
}
}
4 . 使用线程池例如用Executor框架
Executor框架包括:线程池 , Executor , Executors , ExecutorService , CompletionService , Future , Callable 等.