多线程03:线程创建
三种创建方式:
一、Thread 学习提示:查看JDK帮助文档
- 自定义线程类继承Thread类
- 重写run()方法,编写线程执行体
- 创建线程对象,调用start()方法启动线程
1 package com.thread.demo01; 2 3 //创建线程方式一:继承Thread类 , 重写run()方法 , 调用start()方法开启线程 4 5 //总结:注意,线程开启不一定立即执行,由cpu调度 6 7 public class TestThread1 extends Thread { 8 @Override 9 public void run() { 10 //run方法线程体 11 for (int i = 0; i < 20; i++) { 12 System.out.println("我在看代码---" + i); 13 } 14 } 15 16 public static void main(String[] args) { 17 //main线程 ,主线程 18 19 //创建一个线程对象 20 TestThread1 testThread1 = new TestThread1(); 21 22 //调用start()方法开启线程 23 testThread1.start(); 24 25 for (int i = 0; i < 20; i++) { 26 System.out.println("我在学习多线程---" + i); 27 } 28 } 29 }
注意:线程开启不一定立即执行,由cpu调度
案例:多线程下载图片
利用commons-io jar包,它是一个类库,别人写好的工具包
没用Maven之前导入jar包的方法:
一:下载好commons-io-2.6解压复制jar包(http://mirror.bit.edu.cn/apache//commons/io/binaries/commons-io-2.6-bin.zip)
二:添加jar包
三:检查是否导入,导入成果即可使用
思路:
1.想要多线程下载图片。首先写了一个下载器WebDownloader,下载器里面有一个下载方法downloader;通过commons-io工具类库提供的一个FileUtils这个工具类,里面有个方法叫做copyURLToFile,把一个url变成一个文件,需要丢入一个url和一个文件name。然后就会把图片下载下来。
2.下载下来之后,需要去实现一个线程类TestThread02,于是乎继承了一个Thread它就变成了一个线程类。然后丢入url和name用构造器丢入。重写了run()方法,run()方法就是下载图片线程的执行体,线程执行体里面调用了那个下载方法,下载完后输出一下下载了什么东西,比如name。
3.通过构造器去创建了3个线程,通过3个start()去同时启动3个线程。
1 package com.thread.demo01; 2 3 import org.apache.commons.io.FileUtils; 4 5 import java.io.File; 6 import java.io.IOException; 7 import java.net.URL; 8 9 //练习Thread实现一个多线程同步下载图片 10 public class TestThread02 extends Thread { 11 12 private String url; //网络图片地址 13 private String name;//保存的文件名 14 15 public TestThread02(String url, String name) { 16 this.url = url; 17 this.name = name; 18 } 19 20 //下载图片线程的执行体 21 @Override 22 public void run() { 23 WebDownloader webDownloader = new WebDownloader(); 24 webDownloader.downloader(url, name); 25 System.out.println("下载了文件名:" + name); 26 } 27 28 public static void main(String[] args) { 29 TestThread02 t1 = new TestThread02("http://a3.att.hudong.com/35/34/19300001295750130986345801104.jpg", "1.jpg"); 30 TestThread02 t2 = new TestThread02("http://file02.16sucai.com/d/file/2014/1028/f445fe013d861d9e99fd70a0734efd8a.jpg", "2.jpg"); 31 TestThread02 t3 = new TestThread02("http://img.tuzhaozhao.com/2017/10/25/1f33b154b2da3f51_300x300.jpg", "3.jpg"); 32 33 t1.start(); 34 t2.start(); 35 t3.start(); 36 37 } 38 } 39 40 //下载器 41 class WebDownloader { 42 //下载方法 43 public void downloader(String url, String name) { 44 try { 45 FileUtils.copyURLToFile(new URL(url), new File(name)); 46 } catch (IOException e) { 47 e.printStackTrace(); 48 System.out.println("IO异常,downloader方法出现问题"); 49 } 50 } 51 } 52 53 结果: 54 下载了文件名:1.jpg 55 下载了文件名:3.jpg 56 下载了文件名:2.jpg