java多线程学习
1.线程、进程、多线程
进程:
正在进行中的程序,一个程序的执行过程,需要资源:内存、cpu。
线程:
属于进程,指的是一个可以独立运行的代码片段(执行单元、执行路径)。
一个进程中有多个可以独立运行的执行单元,这样的进程称之为多线程的进程。
一个进程中至少有一个线程,这样的进程称之为叫做单线程的进程。
多线程的进程共享同一块内存空间。
CPU在执行时,某一时刻只能执行一个进程,做着高速的切换动作,导致看到的是貌似同时执行的效果(单核)。CPU执行线程的时间是不确定的。抢占式方式抢占CPU的调度。
同类的线程共享堆和方法区资源,但每个线程私有自己的程序计数器、虚拟机栈、本地方法栈。程序计数器私有是为了线程切换后能恢复到正确的位置。而虚拟机栈和本地方法栈私有是为了线程中的局部变量不被其他的线程访问到。
进程是相互独立的,但同一进程的线程可能会相互影响。
并行和并发:
并行:多个任务同时执行,在某一时刻每个任务都在执行,前提–多核。
并发:多个任务同时执行,在某一时刻只有一个任务在执行,其他任务在等待cpu。
2.继承Thread类(创建线程方式一)
创建线程:
java.lang包中有一个Thread对象,用于描述线程事物。
主线程:要运行的代码封装到main方法中的。
子线程:要运行的代码封装到run和call方法中。
1.定义类继承Thread类
2.重写run方法
3.创建子线程对象
4.启动线程,调用start方法
//创建线程方式一:继承Thread类,重写run()方法,主线程调用start()开启线程。注意run与start不同
//总结:线程开启后不一定立即执行,由cpu调度执行
public class TestThread1 extends Thread{
@Override
public void run() {
//run方法线程体
for (int i=0;i<200;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);
}
}
}
3.网图下载
maven项目导入依赖
<dependencies>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
自定义下载器
//下载器
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方法出现问题");
}
}
}
自定义类继承Thread
//练习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://img-operation.csdnimg.cn/csdn/silkroad/img/1665732353444.jpg","1.jpg");
TestThread2 t2=new TestThread2("https://img-home.csdnimg.cn/images/20221021091509.png","2.jpg");
TestThread2 t3=new TestThread2("https://img-operation.csdnimg.cn/csdn/silkroad/img/1666684204807.png","3.jpg");
t1.start();
t2.start();
t3.start();
}
}