1.继承Thread类实现多线程
package com.lixv.demo01;
//创建线程方式一:继承Thread类,重写run()方法,调用start开启线程
//总结:注意,线程开启不一定立即执行,由CPU调度执行
public class TestThread1 extends Thread{
@Override
public void run(){
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码======="+i);
}
}
public static void main(String[] args) {
//main主线程
//创建一个线程对象
TestThread1 testThread1 = new TestThread1();
//调用start方法开启线程
testThread1.start();
for (int i = 0; i < 200; i++) {
System.out.println("我在学习多线程====="+i);
}
}
}
以下是执行结果,可以看出,两个方法是并发执行的
我在看代码=======0
我在学习多线程=====0
我在看代码=======1
我在学习多线程=====1
我在看代码=======2
我在学习多线程=====2
我在看代码=======3
我在学习多线程=====3
我在看代码=======4
我在学习多线程=====4
我在看代码=======5
我在学习多线程=====5
我在看代码=======6
我在学习多线程=====6
我在看代码=======7
我在学习多线程=====7
我在看代码=======8
我在学习多线程=====8
我在学习多线程=====9
我在学习多线程=====10
我在学习多线程=====11
我在看代码=======9
我在看代码=======10
我在看代码=======11
我在学习多线程=====12
我在学习多线程=====13
我在学习多线程=====14
我在学习多线程=====15
如果将调用start方法改为调用run方法,则先执行run方法,再执行之后的代码,二者在同一个线程
package com.lixv.demo01;
//创建线程方式一:继承Thread类,重写run()方法,调用start开启线程
//总结:注意,线程开启不一定立即执行,由CPU调度执行
public class TestThread1 extends Thread{
@Override
public void run(){
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码======="+i);
}
}
public static void main(String[] args) {
//main主线程
//创建一个线程对象
TestThread1 testThread1 = new TestThread1();
//调用run方法开启线程
testThread1.run();
for (int i = 0; i < 200; i++) {
System.out.println("我在学习多线程====="+i);
}
}
}
执行结果
我在看代码=======0
我在看代码=======1
我在看代码=======2
我在看代码=======3
我在看代码=======4
我在看代码=======5
我在看代码=======6
我在看代码=======7
我在看代码=======8
我在看代码=======9
我在看代码=======10
我在看代码=======11
我在看代码=======12
我在看代码=======13
我在看代码=======14
我在看代码=======15
我在看代码=======16
我在看代码=======17
我在看代码=======18
我在看代码=======19
我在学习多线程=====0
我在学习多线程=====1
我在学习多线程=====2
我在学习多线程=====3
我在学习多线程=====4
我在学习多线程=====5
我在学习多线程=====6
我在学习多线程=====7
我在学习多线程=====8
我在学习多线程=====9
我在学习多线程=====10
我在学习多线程=====11
我在学习多线程=====12
我在学习多线程=====13
我在学习多线程=====14
我在学习多线程=====15
我在学习多线程=====16
我在学习多线程=====17
我在学习多线程=====18
我在学习多线程=====19
我在学习多线程=====20
我在学习多线程=====21
我在学习多线程=====22
我在学习多线程=====23
我在学习多线程=====24
我在学习多线程=====25
我在学习多线程=====26
我在学习多线程=====27
我在学习多线程=====28
我在学习多线程=====29
2.通过多线程网上下载图片示例
- 首先我们需要导入一个jar包:commons-io-2.8.0.jar
下载地址:http://commons.apache.org/proper/commons-io/download_io.cgi
- 点击Binaries的zip文件进行下载即可,解压之后文件的目录结构如下
- 把其中的commons-io-2.8.0.jar包导入进项目,记得Add as Library
- 代码内容
package com.lixv.demo01;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
//联系Thread,实现多线程同步下载图片
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);
}
public static void main(String[] args) {
TestThread2 t1 = new TestThread2("https://profile.csdnimg.cn/8/5/C/1_qq_45895576","1.jpg");
TestThread2 t2 = new TestThread2("https://profile.csdnimg.cn/4/4/A/3_g1509635584","2.jpg");
TestThread2 t3 = new TestThread2("https://profile.csdnimg.cn/F/6/D/3_i_r_o_n_m_a_n","3.jpg");
t1.start();
t2.start();
t3.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方法出现异常");
}
}
}
图片都是在网络上查找的
运行结果
并没有按照1,2,3的顺序进行下载,可见这几个线程是并发进行的