使用Thread类和Runnable接口完成图片的同步下载

简介: 使用Thread类和Runnable接口完成图片的同步下载

Thread类实现同步下裁图片:

首先需要在官网下载commons-io-2.6.jar传送门

右击:

举例:

import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
//准备下载器
class webdownload {
    //下载方法
    public void downloader(String url, String name) {
        try {
            FileUtils.copyURLToFile(new URL(url), new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO异常,downloader方法出现问题");
        }
    }
}
public class Thread_test extends Thread{
    private String url;
    private String name;
    public Thread_test(String url,String name){
        this.url=url;
        this.name=name;
    }
    @Override
    public void run() {
        webdownload webdownload=new webdownload();
        webdownload.downloader(url,name);
        System.out.println("下载成功"+name);
    }
    public static void main(String[] args) {//进行下载
        Thread_test thread_test1=new Thread_test("https://img2.baidu.com/it/u=1395980100,2999837177&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1671987600&t=dc660191a7f7ef18d080deaffe75d548","name1");
        Thread_test thread_test2=new Thread_test("https://img1.baidu.com/it/u=1605341541,1182642759&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1671987600&t=a82bfa5ed4d6a73504bb53932cfefe3f","name2");
        Thread_test thread_test3=new Thread_test("https://img2.baidu.com/it/u=1395980100,2999837177&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1671987600&t=dc660191a7f7ef18d080deaffe75d548","name3") ;
        thread_test1.start();
        thread_test2.start();
        thread_test3.start();
    }
}

是通过多线程同步下载这三张图片,因此,每次下载的成功的先后顺序是不相同的,具体由CPU决定:

Runnable接口实现同步下载图片:

与上文中的Thread相比,只需要修改下述这两个地方:

从继承Thread变为实现Runnable接口:

需要单独创建线程对象,去调用start()方法:

使用Runnable接口模拟"龟兔赛跑":

public class Race_test implements Runnable {
    public static void main(String[] args) {
        Race_test race_test=new Race_test();
        //创建线程对象
        new Thread(race_test,"乌龟").start();
        new Thread(race_test,"兔子").start();
    }
    private  static String winner;
    @Override
    public void run() {
        for(int i=0;i<=50;i++){//让兔子"每隔一段时间休息一下"
            if(Thread.currentThread().getName().equals("兔子")&&i%5==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;
        }
        else{
            if(steps>=50) {//判出胜负,比赛结束
                winner=Thread.currentThread().getName();
                System.out.println("winner is"+winner);
                return true;
            }
        }
        return false;
    }
}

输出:

乌龟---->跑了0步
兔子---->跑了0步
乌龟---->跑了1步
兔子---->跑了1步
乌龟---->跑了2步
兔子---->跑了2步
乌龟---->跑了3步
兔子---->跑了3步
乌龟---->跑了4步
兔子---->跑了4步
乌龟---->跑了5步
乌龟---->跑了6步
乌龟---->跑了7步
乌龟---->跑了8步
乌龟---->跑了9步
乌龟---->跑了10步
乌龟---->跑了11步
乌龟---->跑了12步
乌龟---->跑了13步
乌龟---->跑了14步
乌龟---->跑了15步
乌龟---->跑了16步
乌龟---->跑了17步
乌龟---->跑了18步
乌龟---->跑了19步
乌龟---->跑了20步
乌龟---->跑了21步
乌龟---->跑了22步
乌龟---->跑了23步
乌龟---->跑了24步
乌龟---->跑了25步
乌龟---->跑了26步
乌龟---->跑了27步
乌龟---->跑了28步
乌龟---->跑了29步
乌龟---->跑了30步
乌龟---->跑了31步
乌龟---->跑了32步
乌龟---->跑了33步
乌龟---->跑了34步
乌龟---->跑了35步
乌龟---->跑了36步
乌龟---->跑了37步
乌龟---->跑了38步
乌龟---->跑了39步
乌龟---->跑了40步
乌龟---->跑了41步
乌龟---->跑了42步
乌龟---->跑了43步
乌龟---->跑了44步
乌龟---->跑了45步
乌龟---->跑了46步
乌龟---->跑了47步
兔子---->跑了5步
乌龟---->跑了48步
兔子---->跑了6步
乌龟---->跑了49步
兔子---->跑了7步
Winner is乌龟
相关文章
|
1月前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
47 3
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
26 3
|
6月前
|
Java
Java中,有两种主要的方式来创建和管理线程:`Thread`类和`Runnable`接口。
【6月更文挑战第24天】Java创建线程有两种方式:`Thread`类和`Runnable`接口。`Thread`直接继承受限于单继承,适合简单情况;`Runnable`实现接口可多继承,利于资源共享和任务复用。推荐使用`Runnable`以提高灵活性。启动线程需调用`start()`,`Thread`直接启动,`Runnable`需通过`Thread`实例启动。根据项目需求选择适当方式。
64 2
|
7月前
面试官:除了继承Thread类和实现Runnable接口,你知道使用Callable接口的方式来创建线程吗?
面试官:除了继承Thread类和实现Runnable接口,你知道使用Callable接口的方式来创建线程吗?
46 0
面试官:除了继承Thread类和实现Runnable接口,你知道使用Callable接口的方式来创建线程吗?
|
7月前
|
Java
【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)
【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)
|
Java API Go
线程介绍,线程与进程区别,如何使用多线程,Thread类,Runnable接口,补充知识(方法重载,方法重写)
线程介绍,线程与进程区别,如何使用多线程,Thread类,Runnable接口,补充知识(方法重载,方法重写)
|
7月前
|
Java
创建线程的三种方式:继承Thread、Runnable 接口、Callable 接口
创建线程的三种方式:继承Thread、Runnable 接口、Callable 接口
|
数据采集 资源调度 安全
【JavaSE专栏77】线程的创建和启动,继承Thread类或实现Runnable接口完成线程创建启动
【JavaSE专栏77】线程的创建和启动,继承Thread类或实现Runnable接口完成线程创建启动
|
Java 调度
Thread类的方法
Thread类的方法
43 0
创建多线程的方式二:实现Runnable接口
创建多线程的方式二:实现Runnable接口
65 0