java多线程基础
java多线程基础
线程的创建
-
自定义线程类继承Thread类
-
重写run()
-
创建线程对象,调用start()启动线程
public class Demo1 extends Thread{
@Override
public void run() {
// run方法线程体
for (int i = 0; i < 10; i++) {
System.out.println("run \t"+i);
}
}
// 主线程
public static void main(String[] args) {
// 创建一个线程对象
Demo1 demo1 = new Demo1();
// 调用start方法启动线程
// 同时交替执行
demo1.start();
for (int i = 0; i < 10; i++) {
System.out.println("main \t"+i);
}
}
}
线程开启不一定立即执行,由CPU调度
实训:多线程同步下载网络图片
使用commons-io.jar包,需要在阿帕奇官网上下载或者使用Maven等依赖管理工具
org.apache.commons.io
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
// 线程
public class Demo extends Thread{
private String url;
private String file;
// 有参构造器
public Demo(String url, String file) {
this.url = url;
this.file = file;
}
@Override
public void run() {
// 匿名实例化下载器类并调用方法
new WebDownloader().downloader(url,file);
System.out.println("下载地址为"+url);
System.out.println("下载文件名为"+file);
}
// 主线程
public static void main(String[] args) {
// 声明一个图片的url字符串
String imgUrl = "https://img1.baidu.com/it/u=3788606852,2363382091&fm=253&app=53&size=w500&n=0&g=0n&f=jpeg?sec=1646471013&t=61c1b83ed48efcd58624032261739cbc";
// 实例化并触发构造函数
// 线程1
Demo thread1 = new Demo(imgUrl, "img1.jpg");
// 线程2
Demo thread2 = new Demo(imgUrl, "img2.jpg");
// 线程3
Demo thread3 = new Demo(imgUrl, "img3.jpg");
// 启动
thread1.start();
thread2.start();
thread3.start();
// 发现每次结果都不固定
}
}
// 下载器类
class WebDownloader{
// 下载方法
public void downloader(String url,String file){
// 使用commons-io中FileUtils类中的copyURLToFile()
// 从URL到文件
// 参数为(URL,File)
try {
FileUtils.copyURLToFile(new URL(url),new File(file));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,downloader方法出现异常");
}
}
}
发现每次结果都不固定,验证了线程开启不一定立即执行,由CPU调度