Java 中有 三种 线程创建方式,分别为实现 Runnable 接口的 run 方法,继承 Thread 类并重写 run 的方法,使用FutureTask 方式 。
1.继承Thread类
/**
* @Author:Elliot
* @Email:elliot_mr@126.com
* @Date:2019/4/2 14:03
* @Description:Java多线程
* @Version 1.011
*/
public class ThreadTest extends Thread{
//继承Thread类并重写run方法
@Override
public void run() {
System.out.println("Hello Thread!");
}
public static void main(String[] args) {
//创建线程
ThreadTest threadTest = new ThreadTest();
//启动线程
threadTest.start();
}
}
这是一个简单的通过继承实现的多线程的方式.在main方法中创建实例之后,调用该对象的start()方法启动线程,使该线程处于就绪状态,等待获取到CPU资源之后才会真正处于运行状态,一旦run方法执行完毕,该线程就处于终止状态.
使用继承的方式的优缺点
在 run() 方法 内 获取当前线程直接使用 this 就可 以了,无须使用 Thread. currentThread() 方法 。
不好的地方是 Java 不支持多继承,如果继承了 Thread 类,那么就不能再继承其他类。另外任务与代码没有分离 , 当多个线程执行一样的任务时需要多份任务代码
2. 实现Runnable接口
/**
* @Author:Elliot
* @Email:elliot_mr@126.com
* @Date:2019/4/2 14:52
* @Description:Java多线程
* @Version 1.011
*/
public class RunnableTask implements Runnable{
//实现run方法
@Override
public void run() {
System.out.println("Hello Thread!");
}
public static void main(String[] args) {
RunnableTask task = new RunnableTask();
//两个线程共用一个代码逻辑
new Thread(task).start();
new Thread(task).start();
}
}
3. FutureTask方式(Callable)
/**
* @Author:Elliot
* @Email:elliot_mr@126.com
* @Date:2019/4/2 15:00
* @Description:Java多线程,带有返回值的任务
* @Version 1.011
*/
public class CallerTask implements Callable<String> {
@Override
public String call() throws Exception {
return "Hello Thread!";
}
public static void main(String[] args) {
//创建异步任务
FutureTask<String> futureTask = new FutureTask<String>(new CallerTask());
//启动线程
new Thread(futureTask).start();
try {
//等待任务执行完毕,并返回结果
String result = futureTask.get();
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
实现了Callable接口的call()方法。在 main 函数内首先创建 了 一 个 FutrueTask 对象( 构造函数为 CallerTask 的 实例) , 然后使用创建的 FutrueTask对象作为任务创建了一个线程并且启动它, 最后通过 futrueTask.get() 等待任务执行完毕并返回结果 。