文章目录
前言
- 什么是多线程?
我的理解为:将100辆汽车行驶的公路从单车道改成三车道,使得多条车道同时有车行驶,解决拥堵和时长问题。
于是跟着狂神的视频对该部分内容进行学习。
实现步骤
本篇博文通过继承Thread类实现多线程任务。其实现步骤为:
1) 自定义的线程类继承Thread类
2) 重写run()方法,编写线程执行体
3) 创建线程对象,调用start()方法启动线程。
实例——多线程下载图片
- 目标:实现多线程下载网页上的图片到本地
- 导入的包:common-io.jar包
使用包中FileUtils类中方法copyURLToFile(),改方法通过文件url地址将该文件保存到本地。
我用的maven导入该包,代码为:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
- 实现该功能的步骤:
1) 建立一个下载器WebLoader类,类中写入下载图像到本地的方法downloader()。
2) 自定义一个线程类TestThread,继承Thread类。
3) 定义TestThread类的构造函数,传入下载需要的url参数和保存图像时需要的文件名name。
4) 重写方法run()。run()方法为执行下载图像的执行体。建立WebLoader类对象,调用downloader()方法。
5) 在main函数中建立线程类TestThread的对象,调用start()方法启动线程。
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class TestThread extends Thread{
private String url;
private String name;
public TestThread(String url, String name){
this.url = url;
this.name = name;
}
// 下载图片的执行体
@Override
public void run() {
WebLoader webLoader = new WebLoader();
webLoader.downloader(url, name);
System.out.println("下载的文件名为:" + name);
}
public static void main(String[] args) {
TestThread testThread1 = new TestThread("https://bkimg.cdn.bcebos.com/pic/a8014c086e061d95fa492c5e79f40ad162d9ca4d?x-bce-process=image/resize,m_lfit,w_220,limit_1", "./pic1.png");
TestThread testThread2 = new TestThread("https://bkimg.cdn.bcebos.com/pic/09fa513d269759ee8ca42c7ebbfb43166c22df8b?x-bce-process=image/resize,m_lfit,w_640,limit_1", "./pic2.png");
TestThread testThread3 = new TestThread("https://bkimg.cdn.bcebos.com/pic/1c950a7b02087bf4310ebecdfed3572c11dfcf30?x-bce-process=image/resize,m_lfit,w_220,limit_1", "./pic3.png");
testThread1.start();
testThread2.start();
testThread3.start();
}
}
// 下载器
class WebLoader{
public void downloader(String url, String name){
try {
// url为下载图像的url地址, name为下载图像保存到本地的名称
FileUtils.copyURLToFile(new URL(url), new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,downloader有问题");
}
}
}
-
结果
第一次执行结果:
第二次执行结果:
由执行结果可以得出:线程不一定立即执行,而是并行交替进行,由cpu安排调度。
总结
继承Thread类是实现多线程的一种方法,下一篇博文将介绍通过实现Runnable方法实现多线程。两种方法相较更推荐第二种方法。因为该方法可避免单继承的局限性,更加灵活方便,可使得同一个对象被多个线程使用。