线程的创建与运行
Java中有三种线程创建方式,分别为实现Runnable接口的run方法,继承Thread类并重写run的方法,使用FutureTask方式。
1、继承Thread
public static class MyThread extends Thread {
@Override
public void run() {
System.out.println("I am a child thread");
}
}
2、实现Runnable接口
public static class RunnableTask implements Runnable {
public void run() {
System.out.println("I am a child thread");
}
}
3、使用FutureTask方式
public static class CallerTask implements Callable<String> {
public String call() throws Exception {
return "hello";
}
}
测试
public static void main(String[] args) throws InterruptedException {
// 1、继承Thread
MyThread myThread = new MyThread();
myThread.start();
// 2、实现Runnable接口
RunnableTask task = new RunnableTask();
new Thread(task).start();
new Thread(task).start();
// 3、实现Callable接口
// 创建异步任务
FutureTask<String> futureTask = new FutureTask<String>(new CallerTask());
// 启动线程
new Thread(futureTask).start();
try {
// 等待任务执行完毕,并返回结果
String result = futureTask.get();
System.out.println(result);
} catch (ExecutionException e) {
e.printStackTrace();
}
}
对比
| 方式 | 优点 | 缺点 |
|---|---|---|
| 继承Thread | 1、在run()方法内获取当前线程直接使用this就可以了,无须使用Thread.currentThread()方法 2、方便传参,可以在子类里面添加成员变量,通过set方法设置参数或者通过构造函数进行传递 | 1、java不支持多继承 2、任务与代码没有分离,当多个线程执行一样的任务时需要多份任务代码,Runable没有这个限制 3、没有返回值 |
| 实现Runnable接口 | 1、任务与代码分离 2、可以继承其它类 | 1、没有返回值 2、传参只能使用主线程里面被声明为final的变量 |
| 使用FutureTask方式 | 1、有返回结果 | 1、传参只能使用主线程里面被声明为final的变量 |