一个项目所用的技术往往是由业务所驱动的,平常我们写的最多的是业务的CRUD,这是一个普遍的现象,要想往上提升,往往绕不开多线程知识,这篇文章是LZ对多线程实现的一些看法
多线程的三种实现方式
目前多线程的实现方式有三种,让我带您一一看来
继承Thread类
这是我们比较熟悉的一种,废话不多说,先来看看他的使用代码
public class ThreadTest {
public static void main(String[] args) {
/**
*
第一种,继承Thread类
*/
new ThreadDemo().start();
/**
}
static class ThreadDemo extends Thread{
@Override
public void run() {
System.out.println("第一种实现方式!:继承Thread类");
}
}
}
实现Runable接口
这也是我们比较熟悉的一种,以下是代码:
public class ThreadTest {
public static void main(String[] args) {
/**
*
第二种,实现runable 接口
*/
RunableDemo runableDemo=new RunableDemo();
new Thread(runableDemo).start();
}
static class RunableDemo implements Runnable{
@Override
public void run() {
System.out.println("第二种实现方式!:实现Runnable接口");
}
}
}
实现Callable接口
这种实现方式,可能初学者见得比较少,也是先上代码
public class ThreadTest {
public static void main(String[] args) {
/**
*
第三种。实现callable接口
*/
CallableDemo callableDemo=new CallableDemo();
FutureTask futureTask=new FutureTask(callableDemo);
new Thread(futureTask).start();
System.out.println(futureTask.get().toString());//得到任务返回值
}
static class CallableDemo implements Callable{
@Override
public Object call() throws Exception {
System.out.println("第三种实现方式!:实现Callable接口");
return "test";;
}
}
}
三种实现方式的区别
第一种和第二种实现方式都是没有返回值的,也是大家所熟知的,一个继承类,一个实现接口,就不多说了,第三种方法返回了一个Object,这种实现方法可以应用于需要知道任务结果的场景
从代码中可以看到他的使用方式有点不一样,多了FutureTask包装Callable的步骤,然后再是用Thread类的start方法启动,我们点进去FutureTask的源码看看:
相信您也看到了,他最终还是实现了Runnable接口。至于FutureTask,这里就不细讲了,设计到的东西就多了,您现在只要知道get()方法可以拿到任务的返回值就行。之后会细讲这些
三种实现方式的关联
三种实现方式最终都是调用Thread类的start方法来启动线程,来看看Thread类的源码
看到了没,Thread类也是实现了Runable接口,我们都知道多线程是用来做异步任务的,从代码中可以看出run方法是具体做的事情(任务),而Thread类是装异步任务的一个容器,start()方法是这个容器启动任务run()方法的钥匙,
总结下多线程启动的底层(源码层)必要条件:
1、Thread容器(装任务)
2、实现Runable接口(任务)
3、调用Thread.start()(启动任务容器)
之后讲的线程池虽然看上去,没有了这些步骤,实际上是将他们封装到了底层了,这个之后再讲。
lz有话说
这篇文章是楼主在一个周末心血来潮下笔的,第一次写技术文章,才知道原创作者的不容易 ,lz才疏学浅,肯定有很多地方没有注意到,如有大牛看到,望您不吝赐教