java多线程基础

java多线程基础

线程的创建

  1. 自定义线程类继承Thread类

  2. 重写run()

  3. 创建线程对象,调用start()启动线程


public class Demo1 extends Thread{
    @Override
    public void run() {
        // run方法线程体
        for (int i = 0; i < 10; i++) {
            System.out.println("run \t"+i);
        }
    }

    // 主线程
    public static void main(String[] args) {
        // 创建一个线程对象
        Demo1 demo1 = new Demo1();
        // 调用start方法启动线程
        // 同时交替执行
        demo1.start();

        for (int i = 0; i < 10; i++) {
            System.out.println("main \t"+i);
        }
    }
}

线程开启不一定立即执行,由CPU调度

实训:多线程同步下载网络图片

使用commons-io.jar包,需要在阿帕奇官网上下载或者使用Maven等依赖管理工具

org.apache.commons.io

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;

// 线程
public class Demo extends Thread{

    private String url;
    private String file;

    // 有参构造器
    public Demo(String url, String file) {
        this.url = url;
        this.file = file;
    }

    @Override
    public void run() {
        // 匿名实例化下载器类并调用方法
        new WebDownloader().downloader(url,file);
        System.out.println("下载地址为"+url);
        System.out.println("下载文件名为"+file);
    }

    // 主线程
    public static void main(String[] args) {
        // 声明一个图片的url字符串
        String imgUrl = "https://img1.baidu.com/it/u=3788606852,2363382091&fm=253&app=53&size=w500&n=0&g=0n&f=jpeg?sec=1646471013&t=61c1b83ed48efcd58624032261739cbc";

     // 实例化并触发构造函数
        // 线程1
        Demo thread1 = new Demo(imgUrl, "img1.jpg");
        // 线程2
        Demo thread2 = new Demo(imgUrl, "img2.jpg");
        // 线程3
        Demo thread3 = new Demo(imgUrl, "img3.jpg");

        // 启动
        thread1.start();
        thread2.start();
        thread3.start();
        // 发现每次结果都不固定
    }
}

// 下载器类
class WebDownloader{
    // 下载方法
    public void downloader(String url,String file){
        // 使用commons-io中FileUtils类中的copyURLToFile()
        // 从URL到文件
        // 参数为(URL,File)
        try {
            FileUtils.copyURLToFile(new URL(url),new File(file));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO异常,downloader方法出现异常");
        }
    }
}

发现每次结果都不固定,验证了线程开启不一定立即执行,由CPU调度

posted @ 2022-02-03 23:44  CoderCatIce  阅读(26)  评论(0编辑  收藏  举报