一般情况下,创建线程有三种方式:继承 Thread 类、实现 Runnable 接口和实现 Callable 接口。
1)继承 Thread 类:
== 继承 Thread 类,重写 run() 方法,调用 start() 方法启动线程。==
public class CreatThread1 {
public static class ThreadTest1 extends Thread {
@Override
public void run() {
System.out.println("继承Thread类创建线程success!");
}
}
public static void main(String[] args) {
ThreadTest1 myThreadTest1 = new ThreadTest1();
// 调用strat方法启动线程
// myThreadTest1.run();
myThreadTest1.start();
}
}
2)实现 Runnable 接口:
== 实现 Runable 接口,重写 run() 方法。==
public class CreatThread2 implements Runnable {
@Override
public void run() {
System.out.println("实现Runnable接口创建线程success!");
}
public static void main(String[] args) {
CreatThread2 creatThread2 = new CreatThread2();
// new Thread(creatThread2).run();
new Thread(creatThread2).start();
}
}
Q:以上两种方式,都是在调用 start() 方法时调用了 run() 方法,那为什么不能直接去调用 run() 方法呢?
A:以上这两种方式如果直接调用 run() 方法的时候也是能成功执行的。
JVM 在执行 start() 方法时,会先创建一个新线程,由创建出来的新线程去执行 Thread 的 run() 方法,这才起到多线程的效果。如果直接调用 Thread 的 run() 方法,那么 run() 方法还是运行在主线程中,相当于顺序执行,就起不到多线程的效果。
以上这两种创建线程的方法都是没有返回值的,如果我们需要关注线程执行结果的话,就需要第三种创建线程的方式
3)实现 Callable 接口:
== 实现 Callable 接口,重写 call() 方法,这种方式可以通过 FutureTask 获取任务执行的返回值。==
public class CreatThread3 implements Callable {
@Override
public Object call() throws Exception {
return "实现Callable接口创建线程success!";
}
public static void main(String[] args) {
// 创建异步任务
FutureTask<String> task = new FutureTask<String>(new CreatThread3());
// 启动线程
new Thread(task).start();
try {
// 等待执行完成,并获取返回结果
String result = task.get();
System.out.println("FutureTask执行结果: " + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}