目录
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口
接下来的几篇文章记录一下java高并发编程的一些知识,包括实现多线程的3种方式,线程同步的常用方式以及实现线程池的常用工具类等等,本篇先介绍用3种方式实现多线程。
1.继承Thread类
定义一个类直接继承Thread类,重写run方法即可实现多线程,但是由于java单继承的特点,那么此类不能再继承其它的类。
代码示例:
package com.kongsh.c_00;
/**
* @ClassName MyThread01
* @Description: 通过继承Thread,重写run方法实现多线程,缺点是只能单继承
* @Author kongsh
* @Date 2020/6/5
**/
public class MyThread01 extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
//启动5个线程,分别执行run方法
for(int i=0;i<5;i++) {
new MyThread01().start();
}
}
}
执行结果:
2.实现Runnable接口
通过实现runnable接口中的run方法即可实现多线程,而且不受单继承特点的限制
代码示例:
package com.kongsh.c_00;
/**
* @ClassName MyThread02
* @Description: 通过实现Runnable接口,实现run方法实现多线程,启动线程需要通过Thread类
* @Author kongsh
* @Date 2020/6/5
**/
public class MyThread02 implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
for(int i=0;i<5;i++) {
new Thread(new MyThread02()).start();
}
}
}
执行结果:
3.实现Callable接口,通过FutureTask包装器创建Thread线程
Callable接口和Runnable接口是类似的,但是需要实现的是call方法,而且从上面的代码中我们可以看到run()方法执行的任务是没有返回值的,但是call方法有返回值,可以自定义返回值的类型,这就是两个接口最大的区别。
代码示例:
package com.kongsh.c_00;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
* @ClassName MyThread03
* @Description: 通过实现Callable接口的call方法实现多线程程序
* 特点:有返回值,通过FutureTask包装器来创建Thread线程
* @Author kongsh
* @Date 2020/6/5
**/
public class MyThread03 implements Callable {
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName());
return 10;
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
//通过MyThread03实例化一个Callable对象
Callable call = new MyThread03();
//通过call实例化FutureTask类
// 因为此类实现了Runnable接口,所以可以作为Thread构造方法的参数
FutureTask<Integer> task = new FutureTask<>(call);
new Thread(task).start();
}
}
}
执行结果: