创建线程的三种方式
- 继承Thread类并重写run方法
- 实现Runnable接口的run方法
- 使用FutureTask方式
继承Thread类并重写run方法
public class ThreadTest {
public static class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": 我是一个子线程");
}
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
Thread-0: 我是一个子线程
实现Runnable接口的run方法
public class RunnableTaskTest {
public static class RunnableTask implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": 我是一个子线程");
}
}
public static void main(String[] args) {
RunnableTask task = new RunnableTask();
new Thread(task).start();
new Thread(task).start();
}
}
Thread-0: 我是一个子线程
Thread-1: 我是一个子线程
使用FutureTask方式
public class CallableTaskTest {
public static class CallableTask implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println(Thread.currentThread().getName() + ": 我是一个子线程");
return "hello";
}
}
public static void main(String[] args) {
// 创建异步任务
FutureTask<String> futureTask = new FutureTask<>(new CallableTask());
// 启动线程
new Thread(futureTask).start();
String result = null;
try {
result = futureTask.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
System.out.println(result);
}
}
Thread-0: 我是一个子线程
hello
三种方式对比
- 继承方式方便传参, 可以在子类中定义成员变量, 通过set方法或构造器进行初始化参数, 但是Java不支持多继承, 所以继承了Thread类的子类不能继承其他类了;
- Runnable没有继承的限制
- FuntrueTask方式可以拿到任务的返回结果, 前两种方式不行
评论