一、复习
1. 程序、进程、线程
程序:静态的
进程:程序的一次执行过程,动态的
线程:一个QQ.exe是一个进程,聊天发信息是一个线程,聊天接收信息是一个线程,视频通话是一个线程。
进程是操作系统分配资源的单位,线程是CPU调度的单位。
2. 单线程和多线程的区别
3. C++中如何开启子线程
【C++】解决子线程没有被执行的问题_玛丽莲茼蒿的博客-CSDN博客_c++ 线程不执行
4.java中默认的线程
任何一个程序在java中都是多线程的
main线程是肯定有的,还有gc线程。即使这个程序只有System.out.println("hello"),后台也会自动开启gc线程
二、线程的创建的3种方法
2.1 继承Thread类
2.1.1记忆点
1. 分3步
2. 主线程拥有对CPU的优先使用权。但是和C++不同的是,主线程执行完后,即便不使用sleep,子线程依然能够被执行。这或许是因为Java后台自带的守护进程???
2.1.2 简单演示
public class NewThread extends Thread{
@Override
public void run() {
for(int i=0; i<200; i++){
System.out.println(i+" +++++++++++++");
}
}
public static void main(String[] args) {
//子线程
NewThread newThread = new NewThread();
newThread.start();
//主线程
for(int i=0; i<200; i++){
System.out.println(i+" =============");
}
}
}
2.1.3 实战——多线程下载网络图片
本次实战要用到Apache提供的一个第三方包,官网免费下载:
Commons IO – Download Apache Commons IO
解压后找到下图中的jar包
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
public class DownLoadURLThread extends Thread{
private String url;
private String name;
public DownLoadURLThread(String url, String name) {
this.url = url;
this.name = name;
}
//线程执行体
@Override
public void run() {
DownLoader downLoader = new DownLoader();
downLoader.download(this.url,this.name);
System.out.println(this.name+"下载完毕");
}
public static void main(String[] args) {
DownLoadURLThread thread1 = new DownLoadURLThread("https://bkimg.cdn.bcebos.com/pic/6c224f4a20a4462309f77194d977650e0cf3d6ca79b5","1.jpg");
DownLoadURLThread thread2 = new DownLoadURLThread("https://img9.doubanio.com/view/photo/l/public/p2880712216.webp","2.jpg");
DownLoadURLThread thread3 = new DownLoadURLThread("https://img2.baidu.com/it/u=855433571,726115657&fm=253&fmt=auto&app=138&f=JPEG?w=1080&h=408","3.jpg");
thread1.start();
thread2.start();
thread3.start();
}
}
class DownLoader{
public void download(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url), new File(name));
} catch (IOException e) {
e.printStackTrace();
}
}
}