方式二、实现Runnable接口,学习提示:查看JDK帮助文档
- 定义MyRunnable类实现Runnable接口
- 实现run()方法,编写线程线程执行体
- 创建线程对象,调用start()方法启动线程
1 package com.thread.demo01; 2 3 //创建线程方式二: 实现Runnable接口 ,重写run方法 ,执行线程需要丢入runnable接口实现类,调用start()方法 4 public class TestThread03 implements Runnable { 5 6 @Override 7 public void run() { 8 for (int i = 0; i < 20; i++) { 9 System.out.println("我在看代码---" + i); 10 } 11 } 12 13 public static void main(String[] args) { 14 15 //创建一个runnable接口类的实现类对象 16 TestThread03 testThread03 = new TestThread03(); 17 18 //创建线程对象,通过线程对象来开启我们的线程,代理 19 20 new Thread(testThread03).start(); 21 22 for (int i = 0; i < 100; i++) { 23 System.out.println("我在学习多线程--" + i); 24 } 25 } 26 }
改造刚才的多线程下载图片:
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 implements Runnable { 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 new Thread(t1).start(); 34 new Thread(t2).start(); 35 new Thread(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
小结:
- 继承Thread类
- 子类继承Thread类具有多线程能力,Thraed也实现了Runnable接口
- 启动线程:子类对象.start()
- 不建议使用:避免OOP单继承局限性
- 实现Runnable接口
- 实现接口Runnable接口具有多线程能力
- 启动线程:传入目标对象+Thread对象.start()
- 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用