Java多线程实现(一)——继承Thread类


前言

  • 什么是多线程?
    我的理解为:将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有问题");
        }
    }
}
  • 结果
    第一次执行结果:
    - [](https://img-blog.csdnimg.cn/2020122517002080.png)

    第二次执行结果:
    在这里插入图片描述
    由执行结果可以得出:线程不一定立即执行,而是并行交替进行,由cpu安排调度。

总结

继承Thread类是实现多线程的一种方法,下一篇博文将介绍通过实现Runnable方法实现多线程。两种方法相较更推荐第二种方法。因为该方法可避免单继承的局限性,更加灵活方便,可使得同一个对象被多个线程使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值