以下是多线程运行的思想
我们有三个实现多线程运行程序的方法,但最后一个很少用到
1、通过Thread类(重点)
2、通过Runnable接口(重点)
3、Callable接口(了解,本文不对这种方法做出详解)
1、通过Thread类实现多线程
案例代码实现:功能为实现多线程同步下载图片
1.1 依赖导入
先导入apache开源的下载依赖
<dependencies> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> </dependencies>
1.2 创建一个类去继承Thread类
通俗点来说,Thread是一个能让我们开启另外线程的一个类,继承它就可以开启成功,要不我们就只有一个main类主线程
public class liuhaobin extends Thread{}
通过快捷键alt + enter实现run方法体
@Override public void run() {}
1.3通过psvm快捷键创建main主类
public static void main(String[] args) {}
1.4创建一个用于下载作用的下载器
class WebDownloader { public void downloder(String url,String name){ try { FileUtils.copyURLToFile(new URL(url),new File(name)); } catch (IOException e) { e.printStackTrace(); System.out.println("浩彬哥哥救命,出现异常了"); } }
由于我们在下载器里面定义了一个下载方法,里面有两个参数url和name,所以我们要在“liuhaobin”类里面设置参数名和构造
public class Liuhaobin extends Thread { private String url; private String name; //记得写一个构造器 public Liuhaobin(String url,String name){ this.url = url; this.name = name; }
1.5 子线程run方法里面写执行体
首先我们要先把下载器搞出来,然后用上我们在下载器里面设置好的方法,最后打印一下代表完成
//下载图片的执行体 WebDownloader webDownloader = new WebDownloader(); webDownloader.downloder(url,name); System.out.println("哥哥,多线程简单应用成功了,下载文件名是" + name);
1.6 主线程里面只需要创建出对象,并在对象里面给参数赋值,再用对象的start()方法就可以开启子线程帮忙工作咯
public static void main(String[] args) { Liuhaobin liuhaobin = new Liuhaobin("https://i0.hdslb.com/bfs/article/d8d61ec7a8041b3cb5e9a7a521ea4eba3493138905696744.jpg@1256w_2234h_!web-article-pic.avif","liuhaobin1.jpg"); Liuhaobin liuhaobin1 = new Liuhaobin("https://i0.hdslb.com/bfs/article/fcd8093a736cec99e7dc28c2bfba302d3493138905696744.jpg@1256w_1884h_!web-article-pic.avif","liuhaobin2.jpg"); Liuhaobin liuhaobin2 = new Liuhaobin("https://i0.hdslb.com/bfs/article/5a8ae0fe25751228e644f141696b9ed43493138905696744.jpg@1256w_2234h_!web-article-pic.avif","lihaobin3.jpg"); liuhaobin.start(); liuhaobin1.start(); liuhaobin2.start(); }
结果分析
看似是“多线程”,其实是由cpu(调度器)去决定进程里面每个线程的运行,所以每一次运行的结果都有可能不一样的
如此,这篇关于一个简单下载器内容的多线程应用就成功了,大家可以去试试敲敲,稳固基础