阅读 149

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

通过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();

}



}

本文作者:焦虑烧麦

本文链接:https://www.cnblogs.com/jaolvv/p/14674322.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐