创建线程方式一:
继承Thread类,重写run()方法,调用start开启线程。
即:1. 自定义线程类需继承Thread类,
2. 重写run方法,编写线程体,
3. 创建线程对象,调用start()方法。(调用run()方法并不会开启线程,cpu执行完一个才会执行另一个)
注意:线程开启不一定立即执行,由CPU调度执行
public class TestThread1 extends Thread {
@Override
public void run() {
super.run();
//run方法线程体
for (int i = 0; i < 400; i++) {
System.out.println("我再看代码--------" + i);
}
}
public static void main(String[] args) {
//main线程,主线程
//创建一个线程对象
TestThread1 testThread1 = new TestThread1();
//调用start()方法开启线程
testThread1.start();
for (int i = 0; i < 800; i++) {
System.out.println("我在学习多线程------" + i);
}
}
}
结果 :
举一个例子:多线程同步下载图片
1. 先引入commons-io工具类的依赖,用来下载图片。
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
2. 编写一个下载图片的下载器。FileUtils.copyURLToFile()这个方法
/**
* 下载器
*/
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方法出现异常");
}
}
}
3. 写一个线程类,拥有url和name的属性。继承Thread类并重写run()方法。
run()方法内写下载图片的执行体,创建下载器的对象,填入参数。
public class TestThread2 extends Thread {
/**
* 网络图片地址
*/
private String url;
/**
* 保存的文件名
*/
private String name;
public TestThread2(String url, String name) {
this.url = url;
this.name = name;
}
/** 下载图片线程得执行体 */
@Override
public void run() {
WebDownloader webDownloader = new WebDownloader();
webDownloader.downloader(url, name);
System.out.println("下载了文件名为" + name);
}
}
4. 写一个main方法来启动线程,创建线程类对象,传入url和name参数。
public static void main(String[] args) {
TestThread2 t1 = new TestThread2("https://imagepphcloud.thepaper.cn/pph/image/164/281/962.jpg","aaaaaaaaaaaaaaa" );
TestThread2 t2 = new TestThread2("https://imagepphcloud.thepaper.cn/pph/image/164/281/955.jpg","bbbbbbbbbbbbbbb" );
TestThread2 t3 = new TestThread2("https://imagepphcloud.thepaper.cn/pph/image/164/281/966.jpg","ccccccccccccccc" );
//先下载t1
t1.start();
//然后是t2
t2.start();
//然后是t3
t3.start();
}
结果: