简单概念:编好的程序运行时是一个进程,一个进程运行时可有包含多个线程(单核CPU宏观上并行,微观上串行)。
调用start()方法实现多线程(继承Thread类)
package thread;
//创建线程方式一:继承Thread类,重写run()方法,调用start()开启线程。
//线程开启后不一定立即执行,由CPU调度执行
public class TestThread01 extends Thread {
@Override
public void run() { //run方法线程体
for (int i = 0; i < 10; i++) {
System.out.println("run进程" + i);
}
}
public static void main(String[] args) { //main线程,主线程
TestThread01 testThread01 = new TestThread01();
testThread01.start(); //子线程执行run()
//testThread01.run(); 普通方法调用,主线程执行run()
for (int i = 0; i < 1000; i++) {
System.out.println("main进程" + i);
}
}
}
下载commons.io jar包实现多线程下载网络图片。(继承Thread类)
package thread;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class TestThread02 extends Thread {
private String url;
private String name;
//有参构造
public TestThread02(String url, String name){
this.url = url;
this.name = name;
}
@Override
public void run() {
Download d = new Download();
d.download(url, name);
System.out.println("下载图片名为:" + name);
}
public static void main(String[] args) {
TestThread02 t1 = new TestThread02("https://i0.hdslb.com/bfs/album/af3d104fec1dbbd0d827b9303b7fa43a57a96269.jpg@518w.webp", "Yoimiya01.jpg");
TestThread02 t2 = new TestThread02("https://i0.hdslb.com/bfs/album/8b8784a26770bee9d3db0a05dba39eb628f5c253.jpg@518w.webp", "Yoimiya02.jpg");
TestThread02 t3 = new TestThread02("https://i0.hdslb.com/bfs/album/b361130f2e9e22c70de450295dadaf25654cf012.jpg@518w.webp", "yunjin.jpg");
t1.start();
t2.start();
t3.start();
}
}
class Download {
public void download(String url, String name){
try {
FileUtils.copyURLToFile(new URL(url), new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,download方法出现问题");
}
}
}
使用多线程下载网络图片。(使用Runnable接口)
package thread;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
//创建线程方式二:实现Runnable接口,重写run()方法,执行线程需丢入Runnable接口实现类,调用start()方法。
public class TestThread03 implements Runnable {
private String url;
private String name;
public TestThread03(String url, String name){
this.url = url;
this.name = name;
}
@Override
public void run() {
Download01 d = new Download01();
d.download(url, name);
System.out.println("下载图片名为:" + name);
}
public static void main(String[] args) {
//创建Runnable接口类实现对象
TestThread03 tt1 = new TestThread03("https://i0.hdslb.com/bfs/album/701b99929ee3c4dec758b7191d3894b257238190.jpg@518w.webp", "Yoimiya03.jpg");
TestThread03 tt2 = new TestThread03("https://i0.hdslb.com/bfs/article/311a9d65f3f58baac2706ce5edc839127b089f2e.jpg@942w_1290h_progressive.webp", "Yoimiya04.jpg");
TestThread03 tt3 = new TestThread03("https://i0.hdslb.com/bfs/album/bfa49f3297f6dbff8b9038d72baf78421d44c90c.jpg@518w.webp", "Yoimiya05.jpg");
//创建线程对象,通过线程对象来开启线程
new Thread(tt1).start();
new Thread(tt2).start();
new Thread(tt3).start();
}
}
class Download01 {
public void download(String url, String name){
try {
FileUtils.copyURLToFile(new URL(url), new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,download方法出现问题");
}
}
}