在这篇文章中,博主来说说博主了解到的几种创建多线程的方法
1,直接继承Thread方法,来创建多线程:
这种方法是最先接触到多线程所了解到的方法,当需要一个类需要创建多线程的时候让这个类继承Thread,重写其中的run()方法
第一步,继承Thread类,重写run方法:
class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i <100 ; i++) {
System.out.println("支线程-------》"+i);
}
}
}
第二步,创建一个多线程对象:
//新键一个支线程对象
MyThread mt=new MyThread();
第三步,调用start()方法,启动线程:
//开启新线程,会自动调用MyThread的run方法
mt.start();
2,实现Runnable接口
我们可以看看文档中,这是Thread类中的几个构造方法,可以发现可以传Rannable类型的参数来形成一个新的线程
我们可以看到需要传一个Runnable类型的参数,但是Runnable接口不能直接new对象,我们可以通过其他方式来实现。
第一种是创建一个类,来实现Runnable接口,这个类就可以创建对象,并传入Thread的构造方法
第二种是用匿名内部类来实现:
lic static void main(String[] args) {
//匿名内部类实现Runnable接口
Thread th=new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i <100 ; i++) {
System.out.println("冲冲冲"+i);
}
}
});
那么上面两种创建多线程的方法,我们到底用哪种比较好呢,答案是推荐用实现Runnable接口来创建多线程。其原因主要是,我们都知道类只能单继承,而接口可以多实现,当我们继承Thread类的时候就不能继承其他的类了,而实现接口就没有这种困扰
3,实现Callable接口(jdk8新特性)
这个方法听起来和第二种很像,其实是有点差别的:
首先,Callable接口种需要实现的不是run()方法,而是call()方法,
而且,这个接口可以抛出异常
最后,上面两种方法是没有返回值的,而这种方法是可以有返回值的。
所以当我们需要多线程需要返回某值的时候,我们可以使用Callable接口这个方法
//创建一个未来类对象
//可以查看这个FutureTask构造方法有两种,一种参数传Runnable接口,一种传参Callable,第二种有返回值
FutureTask ft=new FutureTask(new Callable() {
@Override
//这里call方法可以看作run方法
public Object call() throws Exception {
System.out.println("begin");
int a=2,b=3;
Thread.sleep(10000);
System.out.println("over");
//自动装箱
return a+b;
}
});
//创建多线程
Thread t=new Thread(ft);
//启动多线程
t.start();
4,使用线程池来创建多线程
线程是一种稀有资源,每个工作的线程都要抢夺CPU时间片,所以当线程创建多了后就会就会造成内存溢出,所以这时候就需要用到线程池的技术了。
总体来说线程池有很大的优势:
1,降低资源消耗
它可以重复利用已创建的线程来降低不必要的消耗
2,增强运行的速率
当任务到达时,不需要等线程创建就可以执行
3,增强线程的管理性
线程池可以统一的分配线程,选择和调用
博主对线程池还没过多的了解,其他关于多线程的内容以后补上
如有错误请指出,谢谢