java-多线程操作全(Thread)-Timer简单使用

 一、 多线程概念和作用

 线程指进程中的一个执行场景,也就是执行流程,那么进程和线程的区别是什么

  1.每个进程是一个应用程序,都有独立的内存空间

  2.同一个进程中的线程共享其进程中的内存和资源

  (共享的内存是堆内存和方法内存,栈内存不共享,每个线程有自己的堆内存)

 进程:进程对应一个应用程序

  现在的计算机都是支持多进程的,在同一个操作系统中,可以同时启动多个进程 

  

 多进程的作用:

 * 单进程只能做一件事 : 一边玩游戏,一边听音乐不是同时运行,而是进程之间的频繁调度,切换速度极高,感觉是同时进行。

 * 多线程的作用不是提高执行速度,而是提高CPU的使用率。进程和进程之间的内存是独立的、

 * 线程:是进程中的执行场景。一个进程可以启动多个线程。

 * 多线程的作用:不是为了提高执行速度,而是为了提高应用程序的使用率

 

 * java程序的运行原理

 * java命令启动java虚拟机,启动JVM,等于启动一个应用程序,表明启动一个进程。该进程会自动启动一个“主线程”,然后主线程去调用某各类的main方法。

 * 所以,main方法运行在主线程中。在此之前的所有程序都是单线程的。

 

 二、线程的创建和启动

 

 *Java虚拟机的主线程入口是main方法,用户可以自己创建线程,创建方式有两种

 *1.继承Thread类

 *2.实现Runnable接口(推荐使用Runnable)

 

 *继承Thread类

 *采用 Thread类创建线程,用户只需要继承 Thread,覆盖 Thread中的run方法,父类 Thread中的run方法没有抛出异常,那么子类也不角能抛出异常,最后采用start启动线程即可

 

 实现Runnable接口

 Thread对象本身就实现了 Runnable接口,但一般建议直接使用 Runnable接口来写多线程程序,因为接口会比类带来更多的好处

 

三、java语言中实现多线程第一种方式

 

1.继承java.lang.Thread

2.重写run方法

三个知识点 :定义线程 、创建线程、 启动线程

package com.steven.demo;import java.lang.Thread;
public class ThreadTest {public static void main(String[] args) {Thread thread = new Student();//启动线程thread.start();//打印Run:0~9//start方法执行完瞬间结束,告诉JVM再分配一个新的线程 给t线程//是随机分配的,没有规律//run不需要手动调用,系统程序启动之后会自动调用方法//thread.run();//这是普通方法的调用,这样做程序只有一个线程,run方法结束之后,下边的程序才会执行for (int i = 0; i < 5; i++) {System.out.println("main"+i);}//有了多线程之后,main方法结束只是主线程中没有方法栈帧了 但是其他线程或者其他栈中还有栈帧  main方法结束,程序可能还在运行
  }
}class Student extends Thread {//重写Run方法public void run() {for (int i = 0; i < 10; i++) {System.out.println("Run:"+i);}}
}

四、java语言中实现多线程第二种方式

1.写一个类实现

2.重写run方法

 

package com.steven.demo;import java.lang.Runnable;
import java.lang.Thread;
public class ThreadTest02 {public static void main(String[] args) {//创建线程:Thread thread = new Thread(new Teacher());//启动线程
    thread.start();}
}
class Teacher implements Runnable {//重写Run方法public void run() {for (int i = 0; i < 10; i++) {System.out.println("Run:"+i);}}
}

五、掌握线程方法

1.获取当前线程的对象 Thread.currentThread()

2.给线程起名t.setName()

3.获取线程的名字:t.getName()

 

package com.steven.demo;
public class ThreadTest03 {public static void main(String[] args) {//获取当前线程的对象 main主线程Thread thread = Thread.currentThread();//获取当前线程的名字System.out.println("当前名称的名称"+thread.getName());//当前名称的名称main
      Thread t1 = new Thread(new ArrayTest());//给线程起名t1.setName("Steven");t1.start();//线程的名称Steven
      Thread thread2 = new Thread(new ArrayTest());//给线程重命名thread2.setName("珂珂");thread2.start();//线程的名称珂珂
  }
}
class ArrayTest implements Runnable {public void run() {Thread thread = Thread.currentThread();//获取当前线程的对象System.out.println("线程的名称"+thread.getName());}
}

六、线程的优先级

优先级高的获取CPU时间片,相对多一些

最高:10

最小:1

默认:5

优先级1-10

优先级高的线程,会得到CPU的时间多一些,优先执行完成

 

public class ThreadTest04 {public static void main(String[] args) {System.out.println("最高"+Thread.MAX_PRIORITY);System.out.println("最小"+Thread.MIN_PRIORITY);System.out.println("默认"+Thread.NORM_PRIORITY);Thread t1 = new Thread(new KeKe());t1.setName("t1");Thread t2 = new Thread(new KeKe());t2.setName("t2");//获取线程的优先级System.out.println("t1优先级"+t1.getPriority());System.out.println("t2优先级"+t2.getPriority());//设置优先级t1.setPriority(5);t2.setPriority(6);//启动
    t1.start();t2.start();//线程虽然有优先级,但是随机分配的,打印结果不一致
  }
}
class KeKe extends Thread {public void run() {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"----------------"+i);}}
}

七、线程休眠

①Thread.sleep()使当前正在执行的线程执行休眠操作(暂停执行) 单位:毫秒

sleep 静态方法 作用: 阻塞当前线程,腾出CPU,让给其他线程

public class ThreadTest05 {public static void main(String[] args) {Thread thread = new Array1();thread.setName("thread1");thread.start();//获取当前线程的对象 main主线程Thread t = Thread.currentThread();//获取当前线程的名字System.out.println("当前名称的名称"+t.getName());//当前名称的名称main    //阻塞主线程for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "-------------------:" + i);try {Thread.sleep(2000);//程序休眠2秒钟} catch (InterruptedException e) {// TODO Auto-generated catch block
                    e.printStackTrace();}}}
}
class Array1 extends Thread {public void run() {System.out.println("线程正在启动=-====");for (int i = 0 ; i < 5 ; i ++) {System.out.println(Thread.currentThread().getName() + "-------------------:" + i);try {Thread.sleep(2000);//程序休眠2秒钟} catch (InterruptedException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}}
}

②Thread.yield()暂停当前正在执行的线程对象,并执行其他线程。

 1.静态方法

 2.作用:给同一个优先级的线程让位,但是让位时间不固定

 3.和sleep方法相同,就是yield的时间不固定

 他与sleep类似,只是不能由用户执行暂停时间,并且yield()只能让同优先级的线程有执行的机会

 

package com.steven.demo;
public class ThreadTest07 {public static void main(String[] args) {//1.创建线程Thread thread = new HThread();thread.setName("线程07");//2.启动线程
       thread.start();//3.主线程for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() +"---------:"+i);}System.out.println("Steven=====");}
}
class HThread extends Thread {public void run() {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() +"---------:"+i);if (i % 2 == 0) {//暂定当前线程,执行其他线程
                Thread.yield();}}}
}

③线程的基本操作

/*线程的基本操作:创建,启动,休眠,异常处理*/
public class ThreadTest06 {public static void main(String[] args) {try {//1.创建线程Thread thread = new MyThread();thread.setName("线程");//2.启动线程
           thread.start();//3.休眠Thread.sleep(2000);System.out.println("Steven=====");}catch (InterruptedException e) {e.printStackTrace();}   }
}class MyThread extends Thread {public void run() {for (int i = 0; i < 10; i++) {try {Thread.sleep(3000);} catch (Exception e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() +"---------:"+i);}}
}

八、线程的合并(join)

public class ThreadTest08 {public static void main(String[] args) {try {//1.创建线程Thread thread = new KThread();thread.setName("线程07");//2.启动线程
       thread.start();//3.合并线程 (线程07和main线程合并)thread.join();//输出只保证一个线程正在执行,依次执行,单线程的程序 (先执行线程07后执行main)//主线程for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() +"---------:"+i);} //当前线程可以调用第一个线程的join方法,调用后当前线程会被阻塞不再执行,直到被调用的线程执行完毕,当前线程才会执行} catch (InterruptedException e) {// TODO Auto-generated catch block
        e.printStackTrace();}}
}
class KThread extends Thread {public void run() {for (int i = 0; i < 10; i++) {try {Thread.sleep(2000);System.out.println(Thread.currentThread().getName() +"---------:"+i);} catch (InterruptedException e) {// TODO Auto-generated catch block
                e.printStackTrace();};}}
}

九、线程同步案例

<1>模拟取款:(不使用同步机制)多线程同时对同一个账号进行取款操作

 

/*
模拟取款:不使用同步机制,多线程同时对同一个账号进行取款操作
thread 和 thread2
异步编程模型:thread线程执行的是thread , thread2线程执行的是thread2 ,两个线程之间谁也不等于谁
同步编程模型:thread线程和thread2线程执行,当thread线程必须等thread2的线程的执行结果之后,thread线程才能执行 ,这是同步编程什么时候需要引入同步:
1.为了数据安全,尽管程序的使用率低,但是为了保证数据安全性,必须得加入线程同步机制, 线程同步机制 使程序变成了单线程(一个线程)
2.在什么条件下需要使用线程同步
<1>必须是多线程环境
<2>多线程环境在共享同一个数据时
<3>共享的数据涉及到修改操作*/
package com.steven.demo;public class ThreadTest09 {public static void main(String[] args) {//创建一个公共的账户Account account = new Account("steven_kou",10000.0);//创建线程对同一个账户进行取款Thread thread = new Thread(new Money(account));thread.setName("steven");Thread thread2 = new Thread(new Money(account));thread2.setName("kou");thread.start();thread2.start();}
}//取款线程
class Money implements Runnable {//账户
    Account account;Money (Account account){this.account = account;}public void run() {account.withDraw(2000.0);System.out.println("取款2000.0$,余额为:"+account.getBalance());//取款2000.0$,余额为:8000.0 (输出两次)
    }}//银行账户
class Account {private String actno;private double balance;//账户余额public Account() {}public Account(String actno,double balance) {this.actno = actno;//成员变量|局部变量this.balance = balance;}public void setActno(String actno) {this.actno = actno;}public String getActno() {return actno;}public void setBalance(double balance) {this.balance = balance;}public double getBalance() {return balance;}//对外提供一个取款方法public void withDraw(double money) {//对账户进行取款操作double after = balance - money;//延迟操作try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();//InterruptedException 线程中断下抛出的异常
        }this.setBalance(after);//更新账户余额,重新赋值
    }
}

<2>模拟取款(同步机制,同步锁synchronized

①以下程序使用线程同步机制保证数据安全

 

package com.steven.demo;
public class ThreadTest09 {public static void main(String[] args) {//创建一个公共的账户Account account = new Account("steven_kou",10000.0);//创建线程对同一个账户进行取款Thread thread = new Thread(new Money(account));thread.setName("steven");Thread thread2 = new Thread(new Money(account));thread2.setName("kou");thread.start();thread2.start();}
}//取款线程
class Money implements Runnable {//账户
    Account account;Money (Account account){this.account = account;}public void run() {account.withDraw(2000.0);System.out.println("取款2000.0$,余额为:"+account.getBalance());//取款2000.0$,余额为:8000.0 (输出两次)
    }}//银行账户
class Account {private String actno;private double balance;//账户余额public Account() {}public Account(String actno,double balance) {this.actno = actno;//成员变量|局部变量this.balance = balance;}public void setActno(String actno) {this.actno = actno;}public String getActno() {return actno;}public void setBalance(double balance) {this.balance = balance;}public double getBalance() {return balance;}//对外提供一个取款方法//TODO 取款 同步public void withDraw(double money) {/*需要把同步的代码,放到同步的语句块中thread线程执行到此处,遇到了synchronized 关键字,就会去找this的对象锁 如果找到了this的对象锁,则进入同步语句块 执行程序当同步语句块代码执行结束的时候,thread线程归还this的对象锁在thread线程执行同步语句块的过程中,如果thread2线程也执行以下代码。遇到synchronized 关键字,所以去找this对象锁,但是该对象被thread线程持有, 只能等待thread线程使用完以后再解锁this对象锁*///同步锁synchronized (this) {//对账户进行取款操作double after = balance - money;//延迟操作try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();//InterruptedException 线程中断下抛出的异常
                }//更新账户余额,重新赋值this.setBalance(after);}}
}

②synchronized关键字 添加到成员方法上,线程拿走的也是this对象锁

//对外提供一个取款方法//TODO 取款 同步//synchronized关键字 添加到成员方法上,线程拿走的也是this对象锁public synchronized void withDraw(double money) {/*需要把同步的代码,放到同步的语句块中thread线程执行到此处,遇到了synchronized 关键字,就会去找this的对象锁 如果找到了this的对象锁,则进入同步语句块 执行程序当同步语句块代码执行结束的时候,thread线程归还this的对象锁在thread线程执行同步语句块的过程中,如果thread2线程也执行以下代码。遇到synchronized 关键字,所以去找this对象锁,但是该对象被thread线程持有, 只能等待thread线程使用完以后再解锁this对象锁*///同步锁
//            synchronized (this) {//对账户进行取款操作double after = balance - money;//延迟操作try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();//InterruptedException 线程中断下抛出的异常
            }//更新账户余额,重新赋值this.setBalance(after);
//            }}

 

三、守护线程

①定义一个用户线程

package com.steven.demo;//定义一个用户线程
public class UserThread01 {public static void main(String[] args) {Runnable runnable = new UserTest();Thread thread = new Thread(runnable, "UserThread");thread.start();for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "==== " + i);}System.out.println("主线程结束---");}
}class UserTest implements Runnable {public void run() {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "==== " + i);}}
}

 

②改为守护线程

package com.steven.demo;
//守护线程
//其他所有的用户线程结束,则守护线程退出
//守护线程一般都是无限执行的 守护线程最后结束(先执行用户线程)
//设置守护线程以后,当前主线程结束后,守护线程并没有把所有的数据输出就结束 也就是说 守护线程是为用户线程服务的,当用户线程全部结束,守护线程会自动化结束public class UserThread02 {public static void main(String[] args) {Thread thread = new UserTest02();thread.setName("thread");//将thread这个用户线程 修改为守护线程thread.setDaemon(true);thread.start();//主线程 for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "==== " + i);try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch block
                    e.printStackTrace();}}System.out.println("主线程结束---");}
}
class UserTest02 extends Thread {public void run() {int i = 0;while (true) {i ++;System.out.println(Thread.currentThread().getName() +"====:"+i);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

四、定时器简单使用:

 

package com.steven.demo;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;/*Timer 定时器*/
public class TimerTest01 {public static void main(String[] args) {System.out.println("来了");   Timer timer = new Timer();try {Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2018-10-07 19:26:02");//安排在指定的时间执行指定的任务timer.schedule(new MyTimer(), date,1000*60*60*24);//date执行后续任务的时间间隔   设置定时任务:在2018-10-07 19:26:02执行此任务, 24小时执行一次//timer.schedule(new MyTimer(), date,1000*2);//如果设置每天执行一次:Date date = new SimpleDateFormat("HH:mm:ss").parse("19:26:02");
          }catch (ParseException e) {e.printStackTrace();} catch (NullPointerException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalStateException e) {e.printStackTrace();}}
}class MyTimer extends TimerTask {public void run() {System.out.println("=="+new Date());//==Sun Oct 07 19:26:02 CST 2018
    }}

 

 

 

 

 

 

转载于:https://www.cnblogs.com/StevenHuSir/p/Java_Thread.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache http强制转为https页面访问(转)

1在httpd.conf文件里使下面模块生效LoadModule rewrite_module modules/mod_rewrite.so2httpd.conf配置文件或者是在httpd-vhost.conf文件里修改<Directory "C:/Apache2.2/docs/1.com">Options Indexes FollowSymLinksAllowOverride All# 上面是http-https时需…

读《系统虚拟化-原理与实现》-第三章

虚拟化概述 概念&#xff1a; 在虚拟环境里&#xff0c;虚拟机监控器&#xff08;VMM&#xff09;抢占了操作系统的位置&#xff0c;编程的物理机的管理者&#xff0c;同时向上层的软件呈现出虚拟的硬件平台&#xff0c;欺骗着上层的操作系统 虚拟机可以看做是物理机的一种高…

智能家居 (5) —— LD3320语音模块二次开发

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

java中事物的注解_编程式事务、XML配置事务、注解实现事务

Spring2.0框架的事务处理有两大类:1 编码式事务 , 这个不说.2 声明式事务 , 就说这个.声明式事务又有三种实现方法:1 (第一种) 最早的方法,用TransactionProxyFactoryBean,他是一个有AOP代理功能的FactoryBean.他返回的对象有事务.还要在spring的配置文件XML中配置,比较麻烦,不…

linux命令整理

1. mkdir ##创建目录 命令 【参数】 路径文件 参数&#xff1a; mkdir -p ##递归创建 mkdir -v ##显示创建目录的过程 示例&#xff1a; [rootXM ~]# mkdir /data [rootXM ~]# mkdir -pv test/{1..3}/{4..6} ##同时创建多个目录及子目录 mkdir: created di…

eclipse搭建SSH框架详解

2019独角兽企业重金招聘Python工程师标准>>> SSH框架是最常用的框架之一&#xff0c;在搭建SSH框架的时候总有人遇到这样&#xff0c;那样的问题。下面我介绍一下SSH框架搭建的全过程。 第一步&#xff1a;准备工作。 下载好eclipse,Struts2,Spring,Hibernate。…

龙芯派启用串口3-5

硬件平台&#xff1a;龙芯派二代 内核版本&#xff1a;linux-3.10 这几天在龙芯派上加了一个无线串口&#xff0c;决定采用串口3来连接串口&#xff0c;在龙芯派上执行 #ls /dev/ttyS* 发现只有ttyS0&#xff0c;查看设备树后发现其他串口的设备树节点都是有的&#xff0c…

智能家居 (7) ——网络服务器线程控制

目录网络线程控制代码inputCommand.hmainPro.csocketControl.c代码测试往期文章网络线程控制代码 inputCommand.h #include <stdio.h> #include <stdlib.h> #include <string.h> #include <wiringPi.h> #include <wiringSerial.h> #include &l…

vue插槽面试题_关于前端Vue框架的面试题,面试官可能会问到哪些。?

这年头&#xff0c;程序员面试都讲究坐姿&#xff0c;姿势不对&#xff0c;努力白费。参照下图&#xff0c;请同学们对号入座。回想一下&#xff0c;自己平时面试的坐姿&#xff0c;你在面试官眼里&#xff0c;大概是什么形象&#xff0c;可能是工程师&#xff0c;也可能是键盘…

测绘软件使用心得

作为测绘工程专业来说&#xff0c;学习使用测绘软件是每一个学生的必修课。在学校我们主要学习autoCAD和南方CASS。 对于CAD是目前使用最广泛的设计软件&#xff0c;广泛应用于建筑&#xff0c;机械&#xff0c;测绘设计等工作。我们主要学习了如何使用CAD来绘制基本图形。在画…

shell 脚本编程之for语句、if语句(2 )

一、bash条件测试&#xff1a;整数测试 [ expression ]字符测试 expression 条件测试 test expression test 根据表达式求值的结果返回 0&#xff08;真&#xff09;或 1&#xff08;假&#xff09;1、整数测试&#xff1a;数值比较-gt 大于-ge 大于或等于-eq…

龙芯3A4000 VNC配置

安装 yum install tigervnc-server -y 拷贝配置文件 cp /lib/systemd/system/vncserver\.service /lib/systemd/system/vncserver:1.service修改配置文件 vim /lib/systemd/system/vncserver:1.service替换< USER>为用户名 配置、启动vnc systemctl enable vncs…

智能家居 (6) ——语音识别线程控制

目录语音识别线程控制代码inputCommand.hmainPro.cvoiceControl.c代码测试往期文章语音识别线程控制代码 inputCommand.h #include <stdio.h> #include <stdlib.h> #include <string.h> #include <wiringPi.h> #include <wiringSerial.h>struc…

java程序设计精编教程第3版电子版课后答案_[java电子书] Java程序设计教程(第3版) PDF 电子书 百度云 网盘下载...

java自学网(www.javazx.com)-java论坛&#xff0c;java电子书推荐&#xff1a;《 Java程序设计教程(第3版)》- d5 C7 V4 o/ e/ Hjava电子书推荐理由&#xff1a;《Java程序设计教程(第3版普通高等教育十二五*规划教材)》讲解Java程序设计知识及其编程方法&#xff0c;包括Java语…

MIPS结构体传参

本文讲解了C语言运行在MIPS体系中结构体传参的情况 硬件平台&#xff1a;Loongson 3A3000 系统&#xff1a;uos 在《see MIPS run》中11.2.5中描述到&#xff0c;会将结构体成员压缩到各个arg寄存器中进行传递 “we have to pack the register with data to mimic the arran…

智能家居 (8) ——智能家居项目整合(网络控制线程、语音控制线程,火灾报警线程)

目录mainPro.c&#xff08;主函数&#xff09;指令工厂inputCommand.hvoiceControl.c&#xff08;语音控制&#xff09;socketControl.c&#xff08;网络线程&#xff09;控制工厂contrlEquipments.hbathroomLight.c&#xff08;浴室灯&#xff09;secondfloorLight.c&#xff…

mpu 配置内存空间_ARM存储器之:存储保护单元MPU

本文引用地址&#xff1a;http://www.eepw.com.cn/article/257010.htm15.4.2内存访问顺序当ARM处理器产生一个内存访问信号时&#xff0c;内存保护单位MPU将负责检查要访问的地址是否在被定义的域中。①如果地址不在任何域中&#xff0c;存储器产生异常。如果内核预取指令则MPU…

对象创建过程之二(类加载器)

2019独角兽企业重金招聘Python工程师标准>>> JAVA为我们提供了两种动态加载机制。 第一种是隐式机制。其实new一个对象和调用类的静态方法时&#xff0c;就是隐式机制在工作。 第二种是显示机制。显示的机制又有两种策略 第一种是用public static Class<?> …

Python_堆栈和队列

堆栈和队列 (1)堆栈&#xff0c;新放进去的先取出 #encodingutf-8 >>> stack [3, 4, 5] >>> stack.append(6) >>> stack.append(7) >>> print (stack) [3, 4, 5, 6, 7] >>> print (stack.pop()) 7 >>> print (stack) […

智能家居 (10) ——人脸识别祥云平台编程使用(编译libcurl库支持SSL,安装SSL依赖库libssl、libcrypto)

目录说明人工智能OCR识别平台介绍人脸识别接口购买编程打通OCR后台实现人脸识别&#xff08;ubuntu上实现&#xff09;问题发现编译libcurl库支持SSL安装SSL依赖库openSSL(使用工具wget)curl库重新配置&#xff0c;编译&#xff0c;安装开启SSL后重新编译人脸识别.C文件传入图片…