day10 线程

逆向工程师的Shopee爬虫避坑指南:af-ac-enc-dat参数生成原理与反反爬策略 本文深入剖析了Shopee电商平台的反爬虫加密机制,重点解析了核心请求头参数x-sap-ri、x-sap-sec及af-ac-enc-dat的生成原理与联动关系。文章从逆向工程视角,提供了定位加密代码、分析算法逻辑的实战方法,并分享了基于JS执行环境模拟与无头浏览器控制的可持续反反爬策略,为高效、稳定地采集数据提供专业指南。 阅读详情

线程、程序与进程

1.线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

2.程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。

3.进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。

4.并发:交替执行 并行:同时执行

Thread类

1.创建多线程的第一种方式
创建Thread的子类,重写其中的run方法,然后在主线程(main方法中)创建对象,再调用start方法

public class MyThread extends Thread{
	public void run(){
		System.out.println("继承类线程执行了");
	}
}
public class ThreadMain{
	public static void main(String[] args){
		MyThread mt=new MyThread();
		mt.start;
	}
}

2.创建多线程的第二种方式
实现Runnable接口,在实现类中重写run方法来描述线程的作用,通过Thread类中的有参构造方法传递Runnable实现类的对象,通过创造出来的Thread的对象调用start方法

java.lang.Thread类的构造方法
Thread(Runnable target) 分配新的 Thread 对象。
Thread(Runnable target, String name) 分配新的 Thread 对象。

public class RunnableImpl implements Runnable{
	public void run(){
		System.out.println("实现类的线程实现了");
	}
}
public class ImplMain{
	public static void main(String[] args){
		RunnableImpl im=new RunnableImpl();
		Thread th=new Thread(im);
		th.start;
	}
}

实现Runnable接口创建多线程程序的好处:

①避免了单继承的局限性
一个类只能继承一个类(一个人只能有一个亲爹),类继承了Thread类就不能继承其他的类
实现了Runnable接口,还可以继承其他的类,实现其他的接口
②增强了程序的扩展性,降低了程序的耦合性(解耦)
实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
实现类中,重写了run方法:用来设置线程任务
创建Thread类对象,调用start方法:用来开启新线程

3.多线程的随机打印结果的原理
多个线程会和main线程抢夺cpu的执行权(执行时间),所以就有了随机打印结果

4.Thread类的常用方法
①获取线程的名称:

1.使用Thread类中的方法getName()
	            String getName() 返回该线程的名称。
2.可以先获取到当前正在执行的线程,使用线程中的方法getName()获取线程的名称
	            static Thread currentThread() 返回对当前正在执行的线程对象的引用。

② public static void sleep(long millis) 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
毫秒数结束之后,线程继续执行

匿名内部类方式实现线程的创建和Lambda简化代码

匿名:没有名字
内部类:写在其他类内部的类

匿名内部类作用:简化代码
把子类继承父类,重写父类的方法,创建子类对象合一步完成
把实现类实现类接口,重写接口中的方法,创建实现类对象合成一步完成
匿名内部类的最终产物:子类/实现类对象,而这个类没有名字

格式:
new 父类/接口(){
重复父类/接口中的方法
};

public class MyStudy {
    public static void main(String[] args) {
        //运用匿名内部类
        Runnable r=new Runnable() {
            @Override
            public void run() {
                System.out.println("内部类的线程执行了"+Thread.currentThread().getName());
            }
        };
        new Thread(r).start();//内部类的线程执行了Thread-0
        //继续简化代码
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("内部类的线程执行了"+Thread.currentThread().getName());
            }
        }).start();//内部类的线程执行了Thread-1

        //运用Lambda简化代码
       new Thread(()->System.out.println("内部类的线程执行了"+Thread.currentThread().getName())).start();
        //内部类的线程执行了Thread-3
    }

}

Thread和Runnable的区别

如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。

总结:
实现Runnable接口比继承Thread类所具有的优势:
1. 适合多个相同的程序代码的线程去共享同一个资源。
2. 可以避免java中的单继承的局限性。
3. 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。
4. 线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。
扩充:在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用 java命令执行一个类的时候,实际上都会启动一个JVM,每一个JVM其实在就是在操作系统中启动了一个进 程。

线程安全和线程同步

1.线程安全
如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样 的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写 操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步, 否则的话就可能影响线程安全
2.线程同步
当我们使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,就容易出现线程安全问题。
Java中提供了同步机制 (synchronized)来解决

有三种方式完成同步操作:
1. 同步代码块。
2. 同步方法。
3.  锁机制

同步代码块:
synchronized 关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。

格式:
 synchronized(同步锁){      需要同步操作的代码 }

同步锁:对象的同步锁只是一个概念,可以想象为在对象上标记了一个锁.

1. 锁对象 可以是任意类型。
2. 多个线程对象  要使用同一把锁。
3. 锁对象作用:把同步代码块锁住,只让一个线程在同步代码块中执行

注意:在任何时候,最多允许一个线程拥有同步锁,谁拿到锁就进入代码块,其他的线程只能在外等着 (BLOCKED)。

同步方法
使用步骤:
1.把访问了共享数据的代码抽取出来,放到一个方法中
2.在方法上添加synchronized修饰符

格式:定义方法的格式
修饰符 synchronized 返回值类型 方法名(参数列表){
    可能会出现线程安全问题的代码(访问了共享数据的代码)

定义一个同步方法

    同步方法也会把方法内部的代码锁住
    只让一个线程执行
    同步方法的锁对象是谁?
    就是实现类对象 new RunnableImpl()
    也是就是this

静态的同步方法

   锁对象是谁?
    不能是this
    this是创建对象之后产生的,静态方法优先于对象
    静态方法的锁对象是本类的class属性-->class文件对象(反射)

Lock锁
java.util.concurrent.locks.Lock接口
Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。
Lock接口中的方法:
void lock()获取锁。
void unlock() 释放锁。
java.util.concurrent.locks.ReentrantLock implements Lock接口

使用步骤:
1.在成员位置创建一个ReentrantLock对象
2.在可能会出现安全问题的代码前调用Lock接口中的方法lock获取锁
3.在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁
卖票类

public class RunnableImpl implements Runnable{
    //定义一个多个线程共享的票源
    private  int ticket = 100;

    //1.在成员位置创建一个ReentrantLock对象
    Lock l = new ReentrantLock();

    //设置线程任务:卖票
    @Override
    public void run() {
        //使用死循环,让卖票操作重复执行
        while(true){
            //2.在可能会出现安全问题的代码前调用Lock接口中的方法lock获取锁
            l.lock();

            //先判断票是否存在
            if(ticket>0){
                //提高安全问题出现的概率,让程序睡眠
                try {
                    Thread.sleep(10);
                    //票存在,卖票 ticket--
                    System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票");
                    ticket--;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    //3.在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁
                    l.unlock();//无论程序是否异常,都会把锁释放
                }
            }
        }
    }

测试类

/*
    模拟卖票案例
    创建3个线程,同时开启,对共享的票进行出售
 */
public class Demo01Ticket {
    public static void main(String[] args) {
        //创建Runnable接口的实现类对象
        RunnableImpl run = new RunnableImpl();
        //创建Thread类对象,构造方法中传递Runnable接口的实现类对象
        Thread t0 = new Thread(run);
        Thread t1 = new Thread(run);
        Thread t2 = new Thread(run);
        //调用start方法开启多线程
        t0.start();
        t1.start();
        t2.start();
    }
}

等待唤醒案例:线程之间的通信

创建一个顾客线程(消费者):告知老板要的包子的种类和数量,调用wait方法,放弃cpu的执行,进入到WAITING状态(无限等待)
创建一个老板线程(生产者):花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子

注意:
顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行
同步使用的锁对象必须保证唯一
只有锁对象才能调用wait和notify方法

Obejct类中的方法
void wait()
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
void notify()
唤醒在此对象监视器上等待的单个线程。
会继续执行wait方法之后的代码

100天精通Python(爬虫篇)——第114天:爬虫基础模块之requests基础入门 一、request模块大总结 1. 下载安装 2. 常用属性或方法 3. response.text和response.content的区别: 4. 发送带headers参数请求 5. 发送带参数请求 6. 在headers参数中携带cookie 7. 超时参数timeout的使用 8. proxies代理参数的使用 9. 发送post请求............... 阅读详情

相关推荐

SAP产品合规(Product Compliance)管理—规格主数据 CG02/CG02WB

SAP产品合规(Product Compliance)管理—规格主数据概览 CG02/CG02WB

Lucas1211的博客 1429

java thread lambda_Java Lambda表达式原理及多线程实现

1、使用Lambda表达式实现多线程public static void main(String[] args) {//使用匿名内部类的方式,实现多线程new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "新线程创建了!");}})....

weixin_34370110的博客 1676

从波形图到参数调优:一次无感BLDC电机启动失败的深度解析

本文深入解析无感BLDC电机启动失败案例,通过波形分析揭示参数不匹配和IPM保护机制触发等关键问题。详细探讨了过零点检测、PWM周期设置及强拖参数调优的底层逻辑,并分享IPM模块保护机制与实战调优技巧,最终实现99.98%的启动成功率。

weixin_29182481的博客 819

使用Lambda 实现 Thread

使用Lambda 来实现 public class LambdaTest04 { public static void main(String[] args) { new Thread(()->{ for(int i=0;i<100;i++) { System.out...

Ethe的博客 5757

matlab 三维绘图 抛光,瓷砖抛光过程建模与仿真

:瓷砖抛 光过程 建模与仿真朱 成 就(广 东工业大学 机 电工程 学院, 广东广州 )摘要 :瓷砖的抛磨影响 因素众 多 ,实际磨削加工时容易出现漏抛 、返抛现象 。对陶瓷抛光机磨头进行运动学分析 ,并基于不 同粒度号 的磨 粒在一定压力下的加工深度模型 ,探讨抛光机磨 头转 速 、横梁摆动频率 、传送速度对瓷砖抛光加工表 面均匀性 的影响,然 后结合 磨削机理使 用 对陶瓷抛光过程进行仿真 ...

weixin_36331058的博客 747

汽车以太网- IEEE 802.3标准

关于汽车以太网,大家看到最多的标准大概就是IEEE802.3bw,也就是我们车内使用的百兆以太网,专业称呼是100BASE-T1,该标准是车内百兆以太网的物理层协议,是我们学习汽车以太网必须要了解的协议。在正式了解协议之前,我们先介绍下什么是IEEE802.3标准。............

weixin_39974126的博客 7106

java_Thread多线程创建和lambda

/** * * @author Mr_zhou * 2018年9月3日 下午6:42:38 &lt;br/&gt; * TODO java多线程 */ //------------------------方式一实现Runnable接口-------------------------- public class TestThread implements Runnable { ...

u011416588的博客 5357

[A-21]ARMv8/v9-SMMU系统架构和功能概述

本文简述了SMMU的系统架构和核心功能

基层架构师的分享 1723

java thread lambda_Java基础(二十一)——多线程和Lambda表达式

同步方法同步方法:使用synchonized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法的外面等待着,排队。格式:public synchonized voidmethod(){//可能会产生线程安全问题的代码}备注:同步锁是谁?对于非static方法,同步锁就是this对于static方法,我们使用当前方法所在类的字节码对象(类名.class)同步方法代码示例如下:...

weixin_31601663的博客 1304

数字IC后端层次化Hierarchical Flow子系统Sub-System模块 block partition和pin assignment细节盘点

数字IC后端培训教程之Hierarchical Flow子系统block partition和pin assignment详细教程

weixin_37584728的博客 1604

基于YOLOv11的工业零件表面缺陷检测系统:从原理到实现

工业质量控制是制造业的核心环节,表面缺陷检测作为其中重要组成部分,直接关系到产品质量和企业效益。本文详细介绍了一种基于YOLOv11深度学习算法的工业零件表面缺陷检测系统,包含完整的算法原理分析、数据集构建方法、模型训练策略以及用户界面设计。通过大量实验验证,该系统能够高效准确地检测零件表面的划痕、凹陷、锈蚀等多种缺陷,检测精度达到96.2%,满足工业实时检测需求。本文还提供了完整的代码实现和详细的技术文档,为相关领域的研究者和工程师提供参考。关键词:表面缺陷检测;YOLOv11;深度学习;工业视觉;

YOLO 567

Day 10多线程

首先,什么是线程安全问题呢?线程安全问题指的是,多个线程同时操作同一个共享资源的时候,可能会出现业务安全问题。下面通过一个取钱的案例给同学们演示一下。案例需求如下场景:小明和小红是一对夫妻,他们有一个共享账户,余额是10万元,小红和小明同时来取钱,并且2人各自都在取钱10万元,可能出现什么问题呢?如下图所示,小明和小红假设都是一个线程,本类每个线程都应该执行完三步操作,才算是完成的取钱的操作。但是真实执行过程可能是下面这样子的。

Xiakeyi的博客 763

【YOLOv11改进 - 特征融合】DySample :超轻量级且高效的动态上采样器

【YOLOv11改进 - 特征融合】DySample :超轻量级且高效的动态上采样器

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1070

Java day_10 线程

一、关于进程和线程,首先从定义上理解就有所不同 1、进程是什么? 是具有一定独立功能的程序、它是系统进行资源分配和调度的一个独立单位,也就是说进程是可以独 立运行的一段程序。 2、线程又是什么? 线程进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源。 Java里面创建线程有两种方式: 1、直接继承Thread 2、实现Runnable接口 两者最大区别就是,Java里面是单继承的,继承Thread类方式将单继承这个位置给占了,只能去实现接口,不

qq_45836790的博客 193

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

线程——进程与线程——day10

在execl中,第一个参数是地址,第二个参数一般为文件名,如果不需要可以不写,但是最后一个参数必须是NULL。可以看到,他并不执行printf(“execl xia \n”);

m0_61988812的博客 630

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Day10 多线程callable

callable和静态代理方法,lambda表达式

qq_45411646的博客 192

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

day10 线程池及gdb调试多线程

当T1 + T3 > T2,这时候就不划算了,使用线程池可以降低频繁创建和销毁线程所带来的的凯西欧啊,任务处理时间比较短的时候这个好处非常显著。我们平时创建一个线程,完成某一个任务,等待线程的退出。假设T1为创建线程时间,T2为在线程任务执行时间,T3为线程销毁时间;2、线程池工作线程,他是任务队列任务的消费者,等待新任务的信号;通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合;1、任务队列,存储需要处理的任务,由工作线程来处理这些任务;on:其他线程会暂停,可以单独调试一个线程。

m0_58066972的博客 309

[Java]Day10:多线程

实现多线程方式一:继承Thread类 方法介绍 方法名 说明 void run() 在线程开启后,此方法将被调用执行 void start() 使此线程开始执行,Java虚拟机会调用run方法() 实现步骤 定义一个类MyThread继承Thread类 在MyThread类中重写run()方法 创建MyThread类的对象 启动线程 两个小问题 为什么要重写run()方法? 因为run()是用来封装被线程执行的代码 run()方法和start()方法的区别?

DhzWorld的博客 196

day10 – 远程线程注入

CreateRemoteThread VirtualAllocEX 做的这个例子首先是创建了一个MFC 对话框程序,然后自己创建了一个 带有导出函数 (简单的减法) 的DLL , 这个Calc按键就是调用自己DLL里面的减法函数 计算1 – 1, 其次创建一个拥有能够修改进程中某函数的入口代码功能的DLL(为什么是DLL,网上有大量详细的资料,), 然后我们还创建一个windows控制台程序 也...

Break-attack的博客 187

Python学习DAY10_进程和线程

进程就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。进程可以通过 fork 或 spawn 的方式来创建新的进程来执行其他的任务,不过新的进程也有自己独立的内存空间,因此必须通过进程间通信机制(IPC,Inter-Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存区等。

学习小屋 1228

Day10-线程进程

什么是进程? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。 在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。这是这样的设计,大大提高了CPU的利用率。进程的出现让每个用户感觉到自己独享CPU...

weixin_30918633的博客 89

python_day10 线程

=====================threading模块 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 from threading import Thread import time def sayhi(name): time.sleep(2) print('%s say hello' ...

weixin_30814319的博客 180

Day10 尚硅谷JUC——线程间通信

第一步:创建资源类,在资源类创建属性和操作方法第二步:在资源类操作方法判断干活通知第三步:创建多个线程,调用资源类的操作方法第四步:防止虚假唤醒问题。

大白的成长之路 419

day15 10线程的操作-线程睡眠

qq_42722278的博客 76

JavaSE入门多线程day10

1.线程安全问题就是多个线程,同时操作同一个共享资源的时候,可能会出现业务安全问题2.原因(1)存在多个线程在同时执行(2)同时访问同一个共享资源(3)存在修改共享资源。

dddddD4563256的博客 118

Day10 多线程理论 开启线程

多线程: 多线程和多进程的不同是他们占用的资源不一样, 一个进程里边可以包含一个或多个进程, 进程的开销大,线程的开销小。 打个比方来说:创建一个进程,就是创建一个车间。创建一个线程,就是在一个车间创建一个流水线。 怎么去开启一个线程: 方法一(直接用默认的类): 1 开启线程的方式一:使用替换threading模块提供的Thread 2 from thre...

weixin_34104341的博客 75
上一篇: day09异常
下一篇: day11 Lamdba函数式编程思想
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值