通过Java多线程实现获取URL下载图片

实现获取URL下载图片

package Demo1;

import org.apache.commons.io.FileUtils;

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

/**
 * Created with IntelliJ IDEA.
 *
 * @Website : https://www.jaolvv.top
 * @Date 4/8/2021 5:12 PM
 * @ClassName TestThread2
 * @Author Liu
 * 注释/说明:
 **/

//练习Thread,实现多线程同步下载图片
public class TestThread2 extends Thread {

    private String url;     //网络图片地址
    private String name;    //保存的文件名

    public TestThread2(String url, String name){
        this.name = name;
        this.url = url;
    }

    //下载线程执行体
    @Override
    public void run() {
        WebDownloader webDownloader = new WebDownloader();
        webDownloader.downloader(url, name);
        System.out.println("下载了文件名为:" + name);
    }


    public static void main(String[] args) {
        TestThread2 t1 = new TestThread2("https://img1.gamersky.com/image2021/04/20210408_ll_red_136_3/gamersky_01small_02_2021481019942.jpg","1.jpg");
        TestThread2 t2 = new TestThread2("https://img1.gamersky.com/image2021/04/20210408_ll_red_136_3/gamersky_02small_04_2021481019D8B.jpg","2.jpg");
        TestThread2 t3 = new TestThread2("https://img1.gamersky.com/image2021/04/20210408_ll_red_136_3/gamersky_03small_06_20214810192A0.jpg","3.jpg");

        t1.start();
        t2.start();
        t3.start();
    }

}
//下载器
class WebDownloader{
    //下载方法
    public void downloader(String url, String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IOException,downloader Method problem");
        }
    }
}

通过继承Thread类创建线程

子类继承Thread类具备多线程能力

启动线程:子类对象.start()

不建议使用:避免OOP单继承局限性

//创建线程方式1:继承Thread类, 重写run()方法,调用start()开启线程
public class TestThread1 extends Thread {
    @Override
    public void run() {
        //run()方法线程体
        for (int i = 0; i < 20; i++) {
            System.out.println("我在看代码---" + i);
        }
    }
    //main线程,主线程
    public static void main(String[] args) {
        //创建一个线程对象
        TestThread1 testThread1 = new TestThread1();
        //调用start()方法开启线程
        testThread1.start();

        for (int i = 0; i < 200; i++) {
            System.out.println("我在学习多线程---" + i);
        }
    }
}

通过Runnable接口创建线程

实现接口Runnable具备多线程能力

启动线程:传入目标对象+Thread对象.start()

推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用

//创建线程方式2:实现Runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用star方法
public class TestThread3 implements Runnable {
    @Override
    public void run() {
        //run方法线程体
        for(int i = 0;i < 200;i++){
            System.out.println("我在看代码---"+i);
        }
    }
    public static void main(String[] args){
        //创建runnable接口的实现类对象
        TestThread3 thread3 = new TestThread3();

        new Thread(thread3).start();

        for(int i = 0;i<200;i++){
            System.out.println("我在学习多线程--"+i);
        }
    }
}

模拟龟兔赛跑

public class TortoiseRam implements Runnable {

    //胜利者
    private static String winner;

    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {

            //模拟兔子休息
            if (Thread.currentThread().getName().equals("兔子") && i % 10 ==0 ){
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            //判断比赛是否结束
            boolean flag = gameOver(i);
            if (flag){
                break;
            }

            System.out.println(Thread.currentThread().getName()+"-->跑了 " + i + " 步");
        }
    }

    private boolean gameOver(int steps){
        //判断是否有胜利者
        if (winner!=null){//以及存在胜利者
            return true;
        }{
            if (steps>=100){
                winner = Thread.currentThread().getName();
                System.out.println("Winner is " + winner);
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        TortoiseRam race = new TortoiseRam();

        new Thread(race,"兔子").start();
        new Thread(race,"乌龟").start();
    }

}
posted @ 2021-04-18 19:24  焦虑烧麦  阅读(178)  评论(0)    收藏  举报