线程,进程,多线程
一:Process与Thread
- 说起进程,就不得不说程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
- 而进程则是执行程序的一次执行过程,它是一个动态的概念。是系统分配资源的单位。
- 通常一个进程内包诺干个线程,当然一个进程至少要包含一个线程,不然没有其存在的意义。线程是CPU调度和执行的单位。
注意:很多线程都是模拟出来的,真正的多线程是指含有多个CPU。如果是模拟出来的多线程,即在一个CPU的情况下,在同一个时间点,CPU只能执行一个代码,因为切换的很快,所以就有同时执行的错觉。
线程创建
一:三种创建方式
1. 继承Thread类创建线程
package threadDemo01;
//创建线程方式之一:继承Thread,重写Run()方法,调用start开启线程
public class ThreadDemo01 extends Thread {
public static void main(String[] args) {
//main线程,主线程
//创建一个线程对象
ThreadDemo01 threadDemo01 = new ThreadDemo01();
//调用start()方法开启线程.
threadDemo01.start();
for (int i = 0; i < 20; i++) {
System.out.println("我在学习多线程"+i);
}
}
@Override
public void run() {
//run方法,线程体
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码:"+i);
}
}
}
输出结果
我在看代码:0
我在学习多线程0
我在看代码:1
我在学习多线程1
我在看代码:2
我在学习多线程2
我在看代码:3
我在学习多线程3
我在看代码:4
我在看代码:5
我在看代码:6
我在看代码:7
我在看代码:8
我在看代码:9
我在看代码:10
我在学习多线程4
我在看代码:11
我在学习多线程5
我在看代码:12
我在学习多线程6
我在看代码:13
我在学习多线程7
我在看代码:14
我在学习多线程8
我在看代码:15
我在看代码:16
我在学习多线程9
我在看代码:17
我在学习多线程10
我在看代码:18
我在看代码:19
我在学习多线程11
我在学习多线程12
我在学习多线程13
我在学习多线程14
我在学习多线程15
我在学习多线程16
我在学习多线程17
我在学习多线程18
我在学习多线程19
总结:可以看见输出结果是乱的,这是因为main主线程和run线程抢占CPU资源,交替执行的结果。而如果把 threadDemo01.start();改成 threadDemo01.run(),那么会按顺序打印。
线程开启不一定立即执行,需要CPU调度安排
Thread下载网络图片案例
代码示例:
package threadDemo01;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class ThreadTest extends Thread {
private String url;
private String name;
public ThreadTest(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) {
ThreadTest threadTest1 = new ThreadTest("https://img2020.cnblogs.com/blog/1418974/202003/1418974-20200318131836219-1993983957.png","图片1");
ThreadTest threadTest2 = new ThreadTest("https://img2020.cnblogs.com/blog/1418974/202003/1418974-20200318132240409-1760266878.png","图片2");
ThreadTest threadTest3 = new ThreadTest("https://img2020.cnblogs.com/i-beta/1418974/202003/1418974-20200317124625447-915223066.png","图片3");
threadTest1.start();
threadTest2.start();
threadTest3.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方法出现问题");
}
}
}
运行结果:可以发现是乱的,并且其实的每次运行的顺序都是随机的,进一步说明了三次调用start()是同时执行的。
下载了:图片1
下载了:图片3
下载了:图片2