线程创建的三种方式
引言
从大学开始学习java也有很长的时间了,从java基础,到现在SpringBoot,SpringCloud的学习感觉像是经过了很久,也想把以前学习的笔记整理一下更深入的去了解学习。本人会陆续的发布一些java基础知识同正在这条路上的码友共同进步,共同学习。
Thread
Thead类也是我今天要写的三种实现线程的方式之一 。通过继承Thread类来实现Thread类中的run()方法来实现一个线程的创建。了解过一部分源码的人应该知道Thead这个类实现了Runnable接口实现run方法,执行了start0方法。这个方法使用native来进行修饰的(native关键字修饰的方法是原生态方法,他的实现是通过c或c++来实现的),废话不多说码上。
public class MyThread extends Thread{
public static void main(String[] args) {
MyThread myThread = new MyThread();
//启动一个线程
myThread.start();
}
//重写run方法
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("i= "+i);
}
}
}
Runnable
通过implements关键字实现Runnable接口,重写Run方法来实现一个线程的创建。码上
public class MyThreadTwo implements Runnable{
public static void main(String[] args) {
//创建线程
Thread thread = new MyThread();
thread.setName("thread02");
//创建线程
MyThreadTwo myThreadTwo = new MyThreadTwo();
Thread thread1 = new Thread(myThreadTwo);
thread1.setName("thread01");
//设置线程的优先级
thread1.setPriority(3);
//启动线程
thread1.start();
thread.start();
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" i= "+i);
}
}
}
Callable
通过实现Callable接口,并实现call方法创建线程。
- 实现Callable接口 重写call 方法。 这里的call方法区别于run方法的地方是有一个处理结果的返回值。
2.使用FatureTask接收所实现的Callable的实现类。这里的FatureTask实现了RunnabeFuture接口,而RunnableFuture接口继承了Future和Runnable接口。感兴趣的了解一下源码。- 创建Thread类,启动线程
public class MyThreadThree implements Callable {
public static void main(String[] args) throws Exception {
MyThreadThree myThreadThree = new MyThreadThree();
FutureTask futureTask = new FutureTask(myThreadThree);
// 创建线程
Thread thread = new Thread(futureTask);
int count = (int) myThreadThree.call();
System.out.println(count);
thread.start();
}
@Override
public Object call() throws Exception {
int count = 0;
for (int i = 0; i < 10; i++) {
count +=i;
// System.out.println(count);
}
return count;
}
}
总结
三种创建方式的总结
1.通过继承Thread直接创建线程比较方便简洁。不利于其扩展性(不推荐使用继承Thread的方式来创建线程)。
2.通过实现Runnable和Callable接口来创建线程不妨碍其直接继承其他的类(java单继承)
3.Callable接口的call方法的结果返回值。区别于run方法,这里可以看实际需求来进行使用。