方法1 继承Thread()
继承Thread()类的多线程创建步骤
- 新建一个类继承
Thread()
类 - 重写
run()
方法 - 在
main()
主函数里头创建新类的对象,调用.start()
方法去实现
下载图片场景示例
package demo01_threadCreation;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
// 练习Thread,实现多线程同步下载图片
// 线程类怎么写?
// 1.先继承 Thread 类,再重写 run() 方法,最后在 main() 内调用线程类对象的 start() 方法
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 wd = new WebDownloader();
wd.downloader(url, name);
System.out.println("下载了文件名名为:"+name+" 的图片文件");
}
public static void main(String[] args) {
TestThread2 tt1 = new TestThread2("http://www.kuangstudy.com/assert/images/index_topleft_logo_black.png", "1.png");
TestThread2 tt2 = new TestThread2("http://www.kuangstudy.com/assert/images/index_topleft_logo_black.png", "2.png");
TestThread2 tt3 = new TestThread2("http://www.kuangstudy.com/assert/images/index_topleft_logo_black.png", "3.png");
tt1.start();
tt2.start();
tt3.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("IO异常,downloader方法错误");
}
}
}
方法2 实现 Runnable 接口
实现 Runnable 接口的多线程创建步骤
- 新建一个类实现
Runnable
类 - 重写
run()
方法 - 执行线程需要丢入Runnable接口new出实现类对象,调用对象的start方法(在
main()
主函数里头创建新类的对象,再把对象作为参数传入Thread()
括号中进行静态代理,再调用.start()
方法去实现)
下载图片场景示例
package demo01_threadCreation;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
// 练习Thread,实现多线程同步下载图片
// 线程类怎么写?
// 1.先继承 Thread 类,再重写 run() 方法,最后在 main() 内调用线程类对象的 start() 方法
public class TestThread2_1_Runnable implements Runnable{
private final String url; // 网络图片地址
private final String name; // 保存的文件名
public TestThread2_1_Runnable(String url, String name){
this.name= name;
this.url = url;
}
// 线程执行体
@Override
public void run() {
WebDownloader wd = new WebDownloader();
wd.downloader(url, name);
System.out.println("下载了文件名名为:"+name+" 的图片文件");
}
public static void main(String[] args) {
TestThread2 tt1 = new TestThread2("http://www.kuangstudy.com/assert/images/index_topleft_logo_black.png", "1.png");
TestThread2 tt2 = new TestThread2("http://www.kuangstudy.com/assert/images/index_topleft_logo_black.png", "2.png");
TestThread2 tt3 = new TestThread2("http://www.kuangstudy.com/assert/images/index_topleft_logo_black.png", "3.png");
new Thread(tt1).start();
new Thread(tt2).start();
new Thread(tt3).start();
}
}
实现 Runnable 接口方法更好
image-20201120212420191.png课后疑问
静态代理是什么鬼?为什么能把一个对象像参数一样传入类构造器来new一个新对象
TestThread2 tt1 = new TestThread2("http://www.kuangstudy.com/assert/images/index_topleft_logo_black.png", "1.png");
new Thread(tt1).start();
网友评论