Python工程师Java之路(e)多线程、单例设计模式、生产者消费者模式

线程安全之Runnable多实例和单实例 多个线程访问共享变量,会导致线程安全问题,导致共享变量值被非预期改变。 那么什么情况会导致共享变量存在呢? 1、类的静态变量 2、多个线程,单个Runable实例,其内部全局变量是共享的 本文主要说明Runnable多实例和单实例(即:上述第2点)的区别及可能产生的问题,详细见代码及注释。 import java.util.concurrent.TimeUnit; /** * *... 阅读详情

  • 并行(parallel):多个事件在同一时刻发生。指在同一时刻,有多条指令在多个处理器上同时执行。
  • 并发(concurrency):多个事件在同一个时间段内发生。指在同一个时刻只能有一条指令执行,但多个进程的指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。

并发示例:
晚上你和妹子网聊,妹子一直秒回,你就以为妹子只在和你聊天。其实妹子在和很多人聊天,但是切换很快,你感觉不出来。

1、Java多线程入门代码

1.1、Thread

  1. 继承Thread类
  2. 重写public void run(),写入业务逻辑
  3. 创建对象,对象.start()来启动线程
class MySleep {
    public static void sleep() {
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 9; i++) {
            System.out.print(i);
            MySleep.sleep();
        }
    }
}

public class Hello {
    public static void main(String[] args) {
        (new MyThread()).start();
        for (int i = 0; i < 9; i++) {
            System.out.print(i);
            MySleep.sleep();
        }
    }
}

打印结果

001122334455667788

1.2、Runnable

  1. 实现Runnable接口
  2. 实现public void run(),写入业务逻辑
  3. 借助Thread对象来start
class MySleep {
    static void sleep() {
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class MyThread implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 9; i++) {
            System.out.print(i);
            MySleep.sleep();
        }
    }
}

public class Hello {
    public static void main(String[] args) {
        Thread t = new Thread(new MyThread());
        t.start();
        for (int i = 0; i < 9; i++) {
            System.out.print(i);
            MySleep.sleep();
        }
    }
}

打印结果

001122334455667788

2、源码截取

2.1、Runnable

  • 只包含一个抽象方法的接口
public interface Runnable {
    public abstract void run();
}

2.2、Thread

  • 实现Runnable接口
  • 可使用静态方法sleep
  • 构造时可传入Runnable实现类的对象
  • 实现了Runnable的抽象方法:调用Runnable实现类对象的run方法
  • start方法开启一个新线程来执行run方法
public class Thread implements Runnable {
    // 静态方法:睡眠(单位:毫秒)
    public static native void sleep(long millis) throws InterruptedException;

    // 其中1个构造器,可传入Runnable实现类的对象
    private Runnable target;
    public Thread(Runnable target) {
        this.target = target;
    }

    // 重写Runnable的run方法
    @Override
    public void run() {
        // 执行Runnable实现类对象的run方法
        if (target != null) {
            target.run();
        }
    }

    // 使线程开始执行
    public synchronized void start() {
        // 两个线程并发运行:
        // 当前线程从start方法的调用返回
        // 另一个线程执行其run方法
    }
}

3、Thread常用API

Thread t = new Thread();
// toString
System.out.println(t); // Thread[Thread-0,5,main]
// 线程的优先级
System.out.println(t.getPriority()); // 5
// 线程的名字
System.out.println(t.getName()); // Thread-0
// 线程组
System.out.println(t.getThreadGroup()); // java.lang.ThreadGroup[name=main,maxpri=10]
// 线程的标识符
System.out.println(t.getId()); // 12

3.1、sleep

自写sleep,复制用

class Sleep {
    public static void sleep(long millisecond) {
        try {
            Thread.sleep(millisecond);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

随机睡眠

import java.util.Random;

class Sleep {
    static void sleep(long millisecond) {
        try {
            Thread.sleep(millisecond);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static void sleep() {
        sleep(10);
    }

    static void sleepRandomly(int bound) {
        Random random = new Random();
        try {
            Thread.sleep(random.nextInt(bound));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static void sleepRandomly() {
        sleepRandomly(100);
    }
}

3.2、join

  • 设置最大等待时间,等待当前线程,直至线程死亡或者等待时间结束
  • 等待时间设为0则永久等待
class Thread1 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                sleep(100L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(i);
        }
    }
}

public class Hello {
    public static void main(String[] args) throws InterruptedException {
        Thread1 t = new Thread1();
        t.start();
        t.join(500L);
        //t.join(99999L);
        for (int i = 0; i < 10; i++) {
            Thread.sleep(100);
            System.out.println("----" + i);
        }
    }
}

4、线程安全

线程锁:使用synchronized来锁定某个公共对象

class Cook extends Thread {
    private static int apples = 10;  // 苹果总数
    private static final Object lock = new Object(); // 锁

    private void box(long millis) {
        if (millis > 0) {
            try {
                //System.out.println("准备礼盒,需要一定时间");
                sleep(millis);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void run() {
        while (true) {
            box(1000L);
            //box(0L);
            synchronized (lock) {
                if (apples > 0) {
                    System.out.print(getName() + "出售1个盒装苹果;");
                    System.out.println("剩余苹果数:" + --apples);
                } else {
                    break;
                }
            }
        }
    }
}

public class Hello {
    public static void main(String[] args) {
        Cook c1 = new Cook();
        Cook c2 = new Cook();
        Cook c3 = new Cook();
        c1.start();
        c2.start();
        c3.start();
    }
}
class Cook implements Runnable {
    private static int apples = 10;  // 苹果总数

    private void box(long millis) {
        if (millis > 0) {
            try {
                //System.out.println("准备礼盒,需要一定时间");
                Thread.sleep(millis);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void run() {
        while (true) {
            box(1000L);
            //box(0L);
            synchronized (this) {
                if (apples > 0) {
                    System.out.print("出售1个盒装苹果;");
                    System.out.println("剩余苹果数:" + --apples);
                } else {
                    break;
                }
            }
        }
    }
}

public class Hello {
    public static void main(String[] args) {
        Cook c = new Cook();
        Thread t1 = new Thread(c);
        Thread t2 = new Thread(c);
        Thread t3 = new Thread(c);
        t1.start();
        t2.start();
        t3.start();
    }
}

synchronized可以写到方法名的前面
非静态方法被锁的是this
静态方法被锁的是当前类.class

class Cook implements Runnable {
    private static int apples = 10;  // 苹果总数

    private void box(long millis) {
        if (millis > 0) {
            try {
                Thread.sleep(millis);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void run() {
        while (apples > 0) {
            box(1000L);
            //box(0L);
            sell();
        }
    }

    private synchronized void sell() {
        if (apples > 0) {
            String name = Thread.currentThread().toString();
            System.out.print(name + "出售1个盒装苹果;");
            System.out.println("剩余苹果数:" + --apples);
        }
    }
}

public class Hello {
    public static void main(String[] args) {
        Cook c = new Cook();
        Thread t1 = new Thread(c);
        Thread t2 = new Thread(c);
        Thread t3 = new Thread(c);
        t1.start();
        t2.start();
        t3.start();
    }
}

5、单例设计模式

1、事先创建好一个单例对象

class Singleton {
    public static final Singleton SINGLETON = new Singleton();
    private Singleton() {}
}

2、需要时才创建单例对象

class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

3、多线程情况下,会有安全问题

class Sleep {
    public static void sleep(long millisecond) {
        try {
            Thread.sleep(millisecond);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            Sleep.sleep(1000);
            instance = new Singleton();
        }
        return instance;
    }
}

public class Hello {
    private static Singleton s1;
    private static Singleton s2;

    public static void main(String[] args) throws InterruptedException {
        // 内部类
        Thread t1 = new Thread(() -> s1 = Singleton.getInstance());
        Thread t2 = new Thread(() -> s2 = Singleton.getInstance());
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(s1 == s2); // false
    }
}

4、加上synchronized

class Sleep {
    public static void sleep(long millisecond) {
        try {
            Thread.sleep(millisecond);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    synchronized public static Singleton getInstance() {
        Sleep.sleep(5000); // 假设需要一系列准备工作
        if (instance == null) {
            Sleep.sleep(1000); // 假设造一个实例出来要较长时间
            instance = new Singleton();
        }
        return instance;
    }
}

public class Hello {
    private static Singleton s1;
    private static Singleton s2;

    public static void main(String[] args) throws InterruptedException {
        // 内部类
        Thread t1 = new Thread(() -> s1 = Singleton.getInstance());
        Thread t2 = new Thread(() -> s2 = Singleton.getInstance());
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(s1 == s2); // true(跑了12秒)
    }
}

5、缩小线程锁范围,提高效率

class Sleep {
    public static void sleep(long millisecond) {
        try {
            Thread.sleep(millisecond);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        Sleep.sleep(5000); // 假设需要一系列准备工作
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    Sleep.sleep(1000); // 假设造一个实例出来要较长时间
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

public class Hello {
    private static Singleton s1;
    private static Singleton s2;

    public static void main(String[] args) throws InterruptedException {
        // 内部类
        Thread t1 = new Thread(() -> s1 = Singleton.getInstance());
        Thread t2 = new Thread(() -> s2 = Singleton.getInstance());
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(s1 == s2); // true(跑了6秒)
    }
}

6、使用内部类

class Singleton {
    private Singleton() {}

    private static class Inner {
        public static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return Inner.INSTANCE;
    }
}

6、死锁

至少2个锁

class Merchant implements Runnable {
    private Object goods;
    private Object money;

    Merchant(Object goods, Object money) {
        this.goods = goods;
        this.money = money;
    }

    @Override
    public void run() {
        synchronized (goods) {
            System.out.println("商家说:先给钱");
            synchronized (money) {
                System.out.println("商家发货");
            }
        }
    }
}

class Customer implements Runnable {
    private Object goods;
    private Object money;

    Customer(Object goods, Object money) {
        this.goods = goods;
        this.money = money;
    }

    @Override
    public void run() {
        synchronized (money) {
            System.out.println("顾客说:先发货");
            synchronized (goods) {
                System.out.println("顾客给钱");
            }
        }
    }
}

public class Hello {
    public static void main(String[] args) {
        Object g = new Object();
        Object m = new Object();
        Merchant s = new Merchant(g, m);
        Customer c = new Customer(g, m);
        new Thread(s).start();
        new Thread(c).start();
    }
}

7、Java线程声明周期

public enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;
}

java.lang.Thread.State

8、线程间通信(wait和notify):生产者和消费者

单个生产者和单个消费者

import java.util.Random;

class Sleep {
    static void sleepRandomly() {
        Random random = new Random();
        try {
            Thread.sleep(random.nextInt(100));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

// 消息队列
class MessageQueue {
    // 容量
    private int capacity = 10;

    // 出队
    synchronized void dequeue() {
        // wait和notify要写在同步代码块中,其调用的对象是锁对象
        if (capacity <= 0) {
            System.out.println("====队列空了,等入队====");
            try {
                // 当前线程进入等待状态,等待其它线程唤醒
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("出队,剩余量:" + --capacity);
        // 随机唤醒一个线程
        this.notify();
    }

    // 入队
    synchronized void enqueue() {
        if (capacity >= 10) {
            System.out.println("----队列满了,等出队----");
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("入队,剩余量:" + ++capacity);
        this.notify();
    }
}

class Producer extends Thread {
    private MessageQueue mq;

    Producer(MessageQueue mq) {
        this.mq = mq;
    }

    @Override
    public void run() {
        while (true) {
            Sleep.sleepRandomly();
            mq.enqueue();
        }
    }
}

class Consumer extends Thread {
    private MessageQueue mq;

    Consumer(MessageQueue mq) {
        this.mq = mq;
    }

    @Override
    public void run() {
        while (true) {
            Sleep.sleepRandomly();
            mq.dequeue();
        }
    }
}

public class Hello {
    public static void main(String[] args) {
        MessageQueue mq = new MessageQueue();
        Producer producer = new Producer(mq);
        Consumer consumer = new Consumer(mq);
        producer.start();
        consumer.start();
    }
}

多个生产者和多个消费者:notifyAll

import java.util.Random;

class Sleep {
    static void sleep(long millisecond) {
        try {
            Thread.sleep(millisecond);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static void sleepRandomly(int bound) {
        Random random = new Random();
        try {
            Thread.sleep(random.nextInt(bound));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static void sleepRandomly() {
        sleepRandomly(200);
    }
}

// 消息队列
class MessageQueue {
    // 容量
    private int capacity;
    private int maxCapacity;

    MessageQueue(int capacity, int maxCapacity) {
        this.capacity = capacity;
        this.maxCapacity = maxCapacity;
    }

    // 出队
    synchronized void dequeue(String name) {
        while (capacity <= 0) {
            System.out.println("========队列空了,等生产========");
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(name + "消费1个,剩余量:" + --capacity);
        // 唤醒其它所有线程
        this.notifyAll();
    }

    // 入队
    synchronized void enqueue(String name) {
        while (capacity >= maxCapacity) {
            System.out.println("--------队列满了,等消费--------");
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(name + "生产1个,剩余量:" + ++capacity);
        this.notifyAll();
    }
}

class Producer extends Thread {
    private MessageQueue mq;

    Producer(MessageQueue mq) {
        System.out.println("生产者名称:" + getName());
        this.mq = mq;
    }

    @Override
    public void run() {
        while (true) {
            Sleep.sleepRandomly();
            mq.enqueue(getName());
        }
    }
}

class Consumer extends Thread {
    private MessageQueue mq;

    Consumer(MessageQueue mq) {
        System.out.println("消费者名称:" + getName());
        this.mq = mq;
    }

    @Override
    public void run() {
        while (true) {
            Sleep.sleepRandomly();
            mq.dequeue(getName());
        }
    }
}

public class Hello {
    public static void main(String[] args) {
        MessageQueue mq = new MessageQueue(2, 4);
        new Producer(mq).start();
        new Producer(mq).start();
        new Consumer(mq).start();
        new Consumer(mq).start();
    }
}
【华为OD-E卷 -97 基站维修工程师 100分(python、java、c++、js、c)】 3 {站点数} 0 2 1 {站点1到各站点的路程} 1 0 2 {站点2到各站点的路程} 2 1 0 {站点3到各站点的路程}遍历生成的路径集合 paths,逐一计算路径的总距离。u,访问过的点集合为 mask 时的最短路径长度。定义 dp[u][mask] 表示当前在点。使用 find_paths 递归生成从点。通过逐步扩展访问点的集合,从只访问起点。在遍历过程中更新最小路径总距离。0 开始,逐步扩展到访问所有点。0 出发、经过所有点的路径。返回最小距离作为最终结果。 阅读详情

相关推荐

配置权重_高盛都在用的资产配置模型,BL贝叶斯框架改进Markowitz

前面我们说到,markoviz的均值-方差模型,第一次,用数学的方式严格证明了投资组合存在最优的权重,但它的学术意义大于实战。主要原因有两个:1,人们很难有效的预测期望收益率;2,最优资产组合配置对输入非常敏感,结果往往难以被人理解。还有就是在投资中,定量只是完成初步构建,同步的定性判断依然非常重要:第一,投资者的认知偏好:倾向于关注他们认为被低估,但有发展潜力或者可以确定相对交易价值的小部分股票...

weixin_39892309的博客 716

java 线程

引用:http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html http://lavasoft.blog.51cto.com/62575/27069/ 在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。 对于直接继承Thread的类来说,代码大致框架是: ...

weixin_33738578的博客 199

PySpark 本地开发环境搭建与实践

本文详细介绍了 PySpark 本地开发环境的搭建过程,包括 JDK、Hadoop、Anaconda、PySpark 的安装以及 Pycharm 工程的创建。同时,深入讲解了代码编写、本地开发案例(如 WordCount、处理特殊分隔符、读取 hdfs 数据、获取外部变量)、Spark 程序的监控和 local 模式下结果文件数量问题等内容。通过掌握这些知识和技能,读者可以在 Windows 本地环境中高效地进行 PySpark 开发,处理大规模数据,解决实际业务中的数据分析和处理问题。

天冬忘忧的博客 3015

生产者消费者

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34356310的博客 122

PS2硬盘启动终极指南:从FMCB到OPL,告别光驱打造游戏博物馆

在计算机存储与数据读取领域,硬盘启动技术通过将操作系统或应用程序从本地硬盘直接加载,绕过了传统光驱等外部介质,实现了速度与可靠性的双重提升。其核心原理在于利用引导程序接管系统初始化流程,直接访问硬盘上的特定分区与文件镜像。这项技术的价值在于极大提升了数据读取效率、降低了物理介质损耗,并扩展了存储容量与管理的灵活性。在怀旧游戏硬件改造、嵌入式系统定制等场景中,硬盘启动技术被广泛应用,以实现老旧设备的功能焕新与性能优化。本文聚焦于索尼PS2游戏主机的硬盘启动方案,深入探讨了如何利用FMCB(Free MCBoo

weixin_34295316的博客 1778

libfranka---joint_impendence_control例程分析

joint_impedance_control.cpp例程分析 部分内容来自链接,我个人以初学者的角度对代码进行了更加细致的解释。 核心部分: // Set and initialize trajectory parameters. const double radius = 0.05; const double vel_max = 0.25; const double acceleration_time = 2.0; const double run_time = 20.0; d

weixin_41567783的博客 1121

生产者消费者模式

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33860553的博客 109

大模型——Ollama简明教程

在这篇文章中,我们将了解如何使用 Ollama、如何在 Ollama 中创建自己的模型 以及如何使用 Ollama 构建聊天机器人。这是深入研究 Ollama 的第一部分,以及我所学到的有关本地 LLM 的知识以及如何将它们用于基于推理的应用程序。在这篇文章中,你将了解——

1700

多线程学习笔记3-线程间的通信(1)(1),Python高级工程师进阶学习—Python热修复原理

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。出一个呈wait状态的线程,对齐发出notify,使它等待获取该对象的对象锁,需要说明的是,执行notify方法后,当前线程不会马上。中调用wait方法,如果调用wait时没有持有适当的锁,抛出runtimeException异常。

2401_83973995的博客 667

Oracle EBS PAC定期成本分配处理程序请求报错:30011一个无效帐户与正在处理的物料关联

Oracle EBS版本: RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 前提条件: 1、启用“MRP:调试模型”配置文件 月结会计反映执行《定期成本分配处理程序》请求报错: 中文:30011一个无效帐户与正在处理的物料关联。: CSTPALPC.create_dist_entry : 40 英文:30011An invalid account is associated with the item being transacted.:...

陈显平的专栏-Oracle EBS 1085

点云焊缝提取

本文介绍了一个基于PCL库的点云处理流程,包含三个核心模块:MLS平滑处理通过多项式拟合修正点云位置;差异提取通过双向匹配定位源/目标点云的非重叠区域;统计过滤剔除离群噪声点。该流程采用"平滑-筛选-净化"的通用思路,将复杂算法封装为可配置接口,实现了工业级点云预处理。文章重点分析了各模块的原理、PCL接口调用及参数设计逻辑,同时指出参数调优、算法扩展等深入探索方向,展现了PCL在点云处理中的模块化优势与实用价值。

weixin_45196569的博客 251

Java基础——单例设计模式

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34177064的博客 97

二维光子晶体禁带的遗传优化算法实现

二维光子晶体禁带的遗传优化算法MATLAB源代码 光子晶体中因周期性结构而存在的频率禁带称为光子禁带,光子禁带的存在是光子晶体具有广泛应用前景的重要原因。 禁带越大,可控光的频带也越宽,因此如何设计合适的晶体结构以获得大的光子禁带一直是研究和应用的重点与热点。 给大家讲解在平面波展开法的基础上,使用遗传算法寻找具有最大光子禁带的二维光子晶体结构。 %-------------------------------------------------------------------------- % Ph

m0_53407570的博客 583

【收藏向】最全全栈工程师学习路径(基于Java)

前言:笔者也是奋斗于全栈学习的学生之一,根据教学各大教学机构、大佬整理、经典教材和自己的实际体验总结出一个全栈工程师学习路径。需要注意的是,这个学习路径是基于Java的,也就是推荐第一语言为Java的读者使用,因为Java使用者广泛、结构完整、是世界上最好用的语言(不接受反驳)。 完整的学习路线图我以百度网盘放在了文章末尾,需要的朋友请自行取阅 第一部分:计算机基础部分 如果想成为优秀的全栈工程师,认真学习计算机基础是必不可少的。上述的学科基本已经在大学学过一遍了,如果您的大学授课内容比较水.

RonaldDong的博客 6837

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

测试面试必备:Python中如何实现多线程

多线程是一种并发编程技术,它允许程序同时执行多个任务。在Python中,虽然由于全局解释器锁(GIL)的存在,多线程并不适合CPU密集型任务,但对于I/O密集型任务仍然非常有用。

qq_58299462的博客 1095

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【算法工程师】Python面试问题总结

机器学习算法工程师面试过程中可能会碰到的一些python语言的问题总结

alicelmx的博客 4065

温度PID控制PLC程序

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

Java工程师必备

Java工程师必备 JAVA基础扎实,熟悉JVM,熟悉网络、多线程、分布式编程及性能调优 精通Java EE相关技术 熟练运用Spring/SpringBoot/MyBatis等基础框架 熟悉分布式系统相关技术 熟悉MySQL及SQL优化 高并发、高可用、微服务、容器化等开发经验 熟悉...

chixi9603的博客 112

python开发工程师培训

python工程师培训人多吗?玛森科技python徐老师介绍,python是一种IT编程语言,出现的时间已经很早了,相比熟悉的JAVA的时间还要早,但是真正爆发的时间是近几年,导致学习培训python的人数呈几何式增长。因此python工程师培训的人肯定是很多的。 零基础小白培训Python要多长时间 这个话题是许多零基础的朋友问得最多的,对于这个问题不能给准确的答案,不同培训机构Python课程的学习时间也不同。一般来讲,Python培训课程需要跟据选择的课程及就业方向来选择,如果是从零基础...

weixin_63757190的博客 144

Python工程师Java之路

最近学大数据,据说要懂点Java才行 安装Java8 第一个Java程序 IDE安装 基础语法 代码注释 命名规范 基本结构 Java是Java面向对象程序设计语言和Java平台的总称 主要特性:面向对象、解释型、平台独立与可移植性

ArYe 757

阿里巴巴python工程师_年薪20万阿里巴巴Python工程师面试题曝光

原标题:年薪20万阿里巴巴Python工程师面试题曝光作为Python工程师,进入大公司是开启职业新起点的关键,今天马哥教育Python智囊团的小伙伴特别分享了其在阿里巴巴面试Python工程师的题目和经历,希望对广大Python工程师的求职者有一个帮助。首先我们来看下阿里巴巴对Python工程师招聘岗位要求:【岗位定义】Python工程师【岗位薪资】15K-30K【基本要求】北京-朝阳区/学历不...

weixin_39671631的博客 202

生产者消费者问题:高并发系统稳定性核心原理与实战

生产者消费者问题本质是多线程/多进程协作中数据流节奏失衡引发的系统性风险,其底层原理在于缓冲区容量、处理速率差与背压机制三者的动态博弈。该模型直接决定消息队列吞吐、线程池稳定性、实时服务延迟等关键技术指标,广泛应用于订单系统、IoT数据采集、风控引擎等高并发场景。理解其在Java阻塞队列、Kafka offset管理、Disruptor环形缓冲区中的差异化实现,是构建可监控、可降级、可伸缩分布式系统的前提。本文聚焦真实线上问题——如无界队列导致OOM、notifyAll引发唤醒风暴、消费者CPU 100%实

weixin_34067102的博客 664

华为python工程师工资-华为工程师对Python编程的看法

原标题:华为工程师对Python编程的看法Python这么火,要不要学?作为一家超有实力的科技公司,华为工程师对Python编程的看法是什么呢?他们认为我们要追求Python编程火热的步伐吗? 在学习过程中有什么不懂得可以加我的python零基础系统学习交流秋秋qun:前面是934,中间109,后面是170,群里有不错的学习教程、开发工具与电子书籍。与你分享python企业当下人才需求及怎么从零基...

weixin_37988176的博客 207

java 多线程

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33721344的博客 55

Java 下跌!Python 第一,编程语言排行再次刷新

编程语言流行指数(PYPL)排行榜近日公布了2019年2月份榜单。 在最新一期榜单上,Python的份额高达26.42%,稳居第一,并且猛增5.2%,同时成为增长势头最好的语言。而被挤到第二的Java,目前份额为21.2%,同比下跌1.3个百分点 。 Python学习指南: https://edu.youkuaiyun.com/topic/python115?utm_source=blog08 ...

优快云学习 2693

ActiveMQ多个消费者消费不均匀问题

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34124651的博客 535

Python跳槽薪资报告:人生苦短,Python工程师们还好吗?

来源 | 100 offer(ID:im100offer)「人生苦短,快用Python」,这话曾是不少选择投入Python麾下的「码农」们的一句调侃和自我标榜。与敏捷开...

AI科技大本营 4246
上一篇: Python工程师Java之路(c)面向对象速查
下一篇: Python工程师Java之路(d)异常
小基基o_O
博客等级 码龄9年 4414粉丝 467原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值