线程A分为A1,A2两个步骤,A1执行完毕后通知线程B,线程B执行完毕后通知线程A,线程A接下来执行步骤A2

java多线程之A线程等B、C线程都执行完在执行的结果示例 此前被面试问道一道面试题,B,C线程都有自己的任务,A线程要在B,C线程都结束后开始执行,并且不允许有A线程循环等待空耗CPU现象。 立即下载
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <assert.h>


static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t waite_recv = PTHREAD_COND_INITIALIZER;
static pthread_cond_t waite_send = PTHREAD_COND_INITIALIZER;

static volatile int message = 0;
static volatile int sem_counts = 0;
static volatile int mut_counts = 0;

#define DO_COUNTS 90000000

int get_sem_counts(){
    return sem_counts;
}

int get_mut_counts(){
    return mut_counts;
}
void reset_mut_counts(){
    mut_counts = 0;
}

#define CHECK_ROUTE( x ) do{\
        int __ret__ = x;\
        if( 0 != __ret__ ){\
                printf("[%s:%d]:%d-%d(%s)\n",__FUNCTION__,__LINE__,__ret__,errno,strerror(errno));\
                return NULL;\
        }\
}while(0)


static void* recv_thread(void* arg) {
    int i = 0;
    for (;i < DO_COUNTS/100; ++i) {
         CHECK_ROUTE(pthread_mutex_lock(&mutex));
        /*
         * be care this wait may be excute after
         * broadcast or signal 
         * in that way U may be lost one condtion
         * at least even may be dead lock here
         * so we must introduce a var to test
         * whether ok.
         */
        for(; 0 == message;) 
        {
            CHECK_ROUTE(pthread_cond_wait(&waite_send, &mutex));
        }
        --message;
        CHECK_ROUTE(pthread_cond_signal(&waite_recv));
        CHECK_ROUTE(pthread_mutex_unlock(&mutex));
        ++mut_counts;
    }
    return NULL;
}

static void* send_thread(void* arg) {
    int i = 0;
    for (;i < DO_COUNTS/100; ++i) {
        CHECK_ROUTE(pthread_mutex_lock(&mutex));
        ++message;
        /**
         * be care this route may be no using when 
         * there're no any thread waite this conition
         * so must changed this usage
         */
        CHECK_ROUTE(pthread_cond_signal(&waite_send));
        CHECK_ROUTE(pthread_cond_wait(&waite_recv, &mutex));
        CHECK_ROUTE(pthread_mutex_unlock(&mutex));

    }
    return NULL;
}

/*
 * this test could work but ....
 */
void* test_mutex_for_semphone(){
    pthread_t recver,sender;
    int i,k;
    void *r = &i,*s = &k;
    message = 0;
    CHECK_ROUTE(pthread_mutex_init(&mutex,NULL));
    CHECK_ROUTE(pthread_cond_init(&waite_recv,NULL));
    CHECK_ROUTE(pthread_cond_init(&waite_send,NULL));
    CHECK_ROUTE(pthread_create(&recver,NULL,recv_thread,NULL));
    CHECK_ROUTE(pthread_create(&sender,NULL,send_thread,NULL));
    CHECK_ROUTE(pthread_join(recver,&r));
    CHECK_ROUTE(pthread_join(sender,&s));
    CHECK_ROUTE(pthread_cond_destroy(&waite_recv));
    CHECK_ROUTE(pthread_cond_destroy(&waite_send));
    CHECK_ROUTE(pthread_mutex_destroy(&mutex));
    assert(message == 0);
}

#include <semaphore.h>

static sem_t send_sem;
static sem_t recv_sem;
void*  sem_send_thread(void* arg){
    int i = 0;
    for(; i < DO_COUNTS/100; ++i){
        ++message;
        CHECK_ROUTE(sem_post(&send_sem));
        CHECK_ROUTE(sem_wait(&recv_sem));
    }
    return NULL;
}

void* sem_recv_thread(){
    int i = 0;    
    for(; i < DO_COUNTS/100; ++i){
        CHECK_ROUTE(sem_wait(&send_sem));
        --message;
        ++mut_counts;
        CHECK_ROUTE(sem_post(&recv_sem));
        ++sem_counts;
    }
    return NULL;    
}



void* test_emphone(){
    pthread_t recver,sender;
    int i,k;
    void *r = &i,*s = &k;
    message = 0;
    CHECK_ROUTE(sem_init(&send_sem,0,0));
    CHECK_ROUTE(sem_init(&recv_sem,0,0));
    CHECK_ROUTE(pthread_create(&recver,NULL,sem_recv_thread,NULL));
    CHECK_ROUTE(pthread_create(&sender,NULL,sem_send_thread,NULL));
    CHECK_ROUTE(pthread_join(recver,&r));
    CHECK_ROUTE(pthread_join(sender,&s));
    CHECK_ROUTE(sem_destroy(&send_sem));
    CHECK_ROUTE(sem_destroy(&recv_sem));
    assert(message == 0);
}


/*
 * 
 * using sem as a mutex to metex var operation
 * no any other process
 * 
 */

static sem_t sem_mutex;

static void* sem_mutex_recv_thread(void* arg){
    int i = 0;
    
    for(; i < DO_COUNTS ; ++i){
        CHECK_ROUTE(sem_wait(&sem_mutex));
        --message;
        ++mut_counts;
         CHECK_ROUTE(sem_post(&sem_mutex));
    }
}

static void* sem_mutex_send_thread(void* arg){
    int i = 0;
    for(; i < DO_COUNTS ; ++i){
        CHECK_ROUTE(sem_wait(&sem_mutex));
        ++message;
        CHECK_ROUTE(sem_post(&sem_mutex));
    }
}


void* test_sem_for_mutex(){
    pthread_t recver,sender;
    int i,k;
    void *r = &i,*s = &k;
    message = 0;
    CHECK_ROUTE(sem_init(&sem_mutex,0,1));
    CHECK_ROUTE(pthread_create(&recver,NULL,sem_mutex_recv_thread,NULL));
    CHECK_ROUTE(pthread_create(&sender,NULL,sem_mutex_send_thread,NULL));
    CHECK_ROUTE(pthread_join(recver,&r));
    CHECK_ROUTE(pthread_join(sender,&s));
    CHECK_ROUTE(sem_destroy(&sem_mutex));
    assert(message == 0);
}

/*
 * 
 * only test for mutex var operation
 * no any other process
 * 
 */

static void* mutex_recv_thread(void* arg){
    int i = 0;
    
    for(; i < DO_COUNTS ; ++i){
        CHECK_ROUTE(pthread_mutex_lock(&mutex));
        --message;
        ++mut_counts;
        CHECK_ROUTE(pthread_mutex_unlock(&mutex));
    }
    
}

static void* mutex_send_thread(void* arg){
    int i = 0;
    for(; i < DO_COUNTS ; ++i){
        CHECK_ROUTE(pthread_mutex_lock(&mutex));
        ++message;
        CHECK_ROUTE(pthread_mutex_unlock(&mutex));
    }
}

void* test_mutex(){
    pthread_t recver,sender;
    int i,k;
    void *r = &i,*s = &k;
    message = 0;
    CHECK_ROUTE(pthread_mutex_init(&mutex,NULL));
    CHECK_ROUTE(pthread_create(&recver,NULL,mutex_recv_thread,NULL));
    CHECK_ROUTE(pthread_create(&sender,NULL,mutex_send_thread,NULL));
    CHECK_ROUTE(pthread_join(recver,&r));
    CHECK_ROUTE(pthread_join(sender,&s));
    CHECK_ROUTE(pthread_mutex_destroy(&mutex));
    assert(message == 0);
}

static sem_t sem_sig;

static void* sem_sig_send(void* arg) {
    int i = 0;
    for (; i < DO_COUNTS; ++i) {        
        /*
         *  ++ operation is not automic operation  
         *  so after following opeation the message
         *  value not make sure
         *  in this case 
         */
        ++message;++mut_counts;
        CHECK_ROUTE(sem_post(&sem_sig));
    }
    return NULL;
}
static void* sem_sig_recv(void* arg){
    int i = 0,k = 0;
    for (; i < DO_COUNTS; ++i) {
        CHECK_ROUTE(sem_wait(&sem_sig));  
        /*
         * this operation not safe maybe dirty read and wirte
         */
        --message;
    }
}

void* test_sem_for_sig(){
    pthread_t recver,sender;
    int i,k;
    void *r = &i,*s = &k;
    CHECK_ROUTE(sem_init(&sem_sig,0,0));
    message = 0;
    CHECK_ROUTE(pthread_create(&recver,NULL,sem_sig_send,NULL));
    CHECK_ROUTE(pthread_create(&sender,NULL,sem_sig_recv,NULL));
    CHECK_ROUTE(pthread_join(recver,&r));
    CHECK_ROUTE(pthread_join(sender,&s));
    CHECK_ROUTE(sem_destroy(&sem_sig));
}

static pthread_mutex_t guard;
static sem_t wait_object;


static void* mix_send(void* arg) {
    int i = 0;
    for (; i < DO_COUNTS; ++i) {        
        pthread_mutex_lock(&guard);
        ++message;++mut_counts;
        pthread_mutex_unlock(&guard);
        CHECK_ROUTE(sem_post(&wait_object));
    }
    return NULL;
}
static void* mix_recv(void* arg){
    int i = 0,k = 0;
    for (; i < DO_COUNTS; ++i) {
        CHECK_ROUTE(sem_wait(&wait_object));  
        pthread_mutex_lock(&guard);
        --message;
        pthread_mutex_unlock(&guard);
    }
    return NULL;
}
#include <assert.h>
void* test_mix(){
    pthread_t recver,sender;
    int i,k;
    void *r = &i,*s = &k;
    CHECK_ROUTE(sem_init(&wait_object,0,0));
    CHECK_ROUTE(pthread_mutex_init(&guard,NULL));
    message = 0;
    CHECK_ROUTE(pthread_create(&recver,NULL,mix_send,NULL));
    CHECK_ROUTE(pthread_create(&sender,NULL,mix_recv,NULL));
    CHECK_ROUTE(pthread_join(recver,&r));
    CHECK_ROUTE(pthread_join(sender,&s));
    CHECK_ROUTE(sem_destroy(&wait_object));
    CHECK_ROUTE(pthread_mutex_unlock(&guard));
    assert(message == 0);
}
#include <time.h>
/*
 * 
 */
void find_id_number(const char* tail_xx);
void* test_mutex_for_semphone();
void* test_emphone();
void* test_mutex();
void* test_sem_for_mutex();
void* test_sem_for_sig();
void* test_sem_mix();
int get_sem_counts();
int get_mut_counts();
void reset_mut_counts();

static void test_time(){
    time_t now = time(NULL);
    int i = 0,interval = time(NULL) - now;
    for (; interval < 10; ++i) {
        test_emphone();
        interval = time(NULL) - now;
    }
    printf("10 sec sem done %d:%d:%d\n", i,interval,get_sem_counts());
    reset_mut_counts();
    now = time(NULL);
    interval = time(NULL) - now;
    for (i = 0; interval < 10; ++i) {
        test_mutex_for_semphone();
        interval = time(NULL) - now;
    }
    printf("10 sec mutex done %d:%d:%d\n", i,interval,get_mut_counts());    
    reset_mut_counts();
    now = time(NULL);
    interval = time(NULL) - now;
    for (i = 0; interval < 10; ++i) {
        test_sem_for_mutex();
        interval = time(NULL) - now;
    }
    printf("10 sec sem_for_mutex done %d:%d:%d\n", i,interval,get_mut_counts());        
    reset_mut_counts();
    now = time(NULL);
    interval = time(NULL) - now;
    for (i = 0; interval < 10; ++i) {
        test_mutex();
        interval = time(NULL) - now;
    }
    printf("10 sec only mutex done %d:%d:%d\n", i,interval,get_mut_counts());        
    reset_mut_counts();
    now = time(NULL);
    interval = time(NULL) - now;
    for (i = 0; interval < 10; ++i) {
        test_sem_for_sig();
        interval = time(NULL) - now;
    }
    printf("10 sec only sem done %d:%d:%d\n", i,interval,get_mut_counts());        
    reset_mut_counts();
    now = time(NULL);
    interval = time(NULL) - now;
    for (i = 0; interval < 10; ++i) {
        test_mix();
        interval = time(NULL) - now;
    }
    printf("10 sec mix done %d:%d:%d\n", i,interval,get_mut_counts());            
}

int main(int argc, char** argv) {
    test_time();
    return (EXIT_SUCCESS);
}
10 sec sem done 1:25:900000
10 sec mutex done 1:37:900000
10 sec sem_for_mutex done 1:25:90000000
10 sec only mutex done 1:14:90000000
10 sec only sem done 1:50:90000000
10 sec mix done 1:25:90000000



matlab处理las点云(1)——las/laz格式解析【2024最新版】 matlab中的las/laz格式解析。博客长期更新,本文最近一次更新时间为:2024年11月9日。 阅读详情

相关推荐

代码复现——SymAgent:一种用于知识图谱复杂推理的神经符号自学习Agent框架

根据《SymAgent: A Neural-Symbolic Self-Learning Agent Framework for Complex Reasoning over Knowledge Graphs》(《SymAgent:一种用于知识图谱复杂推理的神经符号自学习Agent框架》)论文思路,简单复现代码,以实现SymAgent中的Agent-Planner和Agent-Executor模块。Agent-Planner利用大语言模型的归纳推理能力从知识图谱中提取符号规则,指导高效的问题分解。

qq_60040306的博客 1604

数据结构课程设计小组任务2:找出从指定结点出发且长度为m的所有简单路径

问题描述 : 在使用图的邻接表ADT的基础上,设计一个算法,按照深度优先搜索的思想找出从指定结点出发且长度为m的所有简单路径。并将此算法加入到邻接表ADT中,在邻接表ADT中提供一个公有的成员函数FindPath(start, m)。 提示: (1)这个问题相当于从指定结点开始深度优先遍历,而且遍历的深度正好为m。为此,在遍历时需要记住遍历的深度,当深度达到m时,就不需要递归了。此时需要输出这条路径,因此在遍历的过程中还需要记住整条路径。 (2)由于深度优先遍历是用递归实现的,所以FindPa

Y_Aryan的博客 1744

【漆学军】MT4进阶到MT5速成之路(2)获取持仓

MT5在持仓获取上,要比MT4复杂些,分两部分,获取持仓和挂单采用了不同的方法。 一、获取持仓中的buy和sell单 int b=0;//获取buy单个数 int s=0;//获取sell单个数 double lot_total_buy=0;//获取持仓中buy单的总手数 double lot_total_sell=0;//获取持仓中sell单的总手数 for(int i=0; i<PositionsTotal(); i++) { ulong ticket=Positi

漆学军的编程笔记 1623

java中一个线程等待另一个线程执行完后再执行

有3中方法 1.notify、wait方法,示例如下。 package com.thread_lc; class MyThread1 implements Runnable { public int i = 10; @Override public void run () { Thread currThread = Thread.curre

hellorichen的专栏 3万+

App渗透 - 人脸识别登录绕过

一、APP抓包和逆向破解加密算法打开APP是一个登录框抓包后发现参数被加密了使用Jadx脱源码发现,并没有加壳也没有混淆,运气很好根据经验,先搜索Encrypt、Decrypt等关键字,发现在Common.js中有一个encryptData函数定位过去,一套加解密算法都写好了放在这放到浏览器console里面调试,果然没错二、寻找注入点首先测试了一下注入明文:{"userName":"TEST'...

渗透测试研究中心 2823

gurobi最新下载安装教程 2023.11

我下载的最新版gurobi支持python3.7-python3.11,这个序号与计算机硬件捆绑,一旦激活就会失效。运行激活码之后,产生的。如果既放置在了上面的默认搜索目录,又设置了。系统环境变量(不是用户环境变量),指向保存的目录和文件名(例如。高版本产生的许可文件兼容低版本。验证不会成功,学术许可不会激活。之后cmd进入命令行,cd进入gurobi所在的。,实测不到一小时即可审核完毕,获得对应的许可。如果学校的网关没有将本校的。系统环境变量指向不同的目录和文件,原厂无关,是学校网络的设置问题。

Cachel Wood的博客 2万+

5.【多线程面试篇】

线程基础 Q:什么是上下文切换? 首先CPU再同一个时刻只能执行一个线程(它会为每个线程分配CPU时间片,每个时间片非常短,让人理解为同事执行。)cpu通过分配时间片来循环执行任务,线程A执行一个时间片后,会切换到线程B(不一定是A结束),但是切换前会保存A线程的状态,以便下次切换回A。所以:线程A从保存到再次加载执行就是一次上下文切换。 例子:同时读两本书(肯定是换着读),当我们读一本英文书,发现某个单次不认识,于是打开词典查询,查询前肯定要标记现在读到哪里了,查完词典,接着读下面的内容,切换是影响读书效

qq_33700648的博客 725

【音视频】PJSIP库——示例简介、C++类说明

aectest音频回声消除测试工具,用于演示音频处理模块中的回声消除(AEC)功能,通常用于 VoIP 场景中优化语音质量。auddemo音频播放 / 录制演示,展示如何使用 PJProject 的音频接口进行基本的音频数据采集、播放和处理,例如波形显示或格式转换。stereotest立体声处理测试,可能用于演示多声道音频的处理方式,如混音、声道分离等。tonegen音频信号生成工具,用于生成测试用的音频信号(如正弦波、音调等),常用于音频设备测试或调试。recfile。

郭老二 434

如何让线程A,B,C顺序执行

有时候我们会遇到这样的场景,就是在某个线程执行完后,才能执行其它线程,基于这个那么如何让多个线程顺序执行呢? 现在有A,B,C三个线程,那么怎样让A线程执行完后B执行最后C执行。 三个线程类如下: class ThreadA implements Runnable{ @Override public void run() { // TODO Auto-gener...

rufeng的博客 4380

基于 ESP32 的智能药盒提醒装置设计与实现

本装置基于 ESP32 实现了智能药盒的核心功能,硬件选型兼顾成本与实用性,软件设计模块化、易拓展。后续可通过 ESP32 的 WiFi 模块接入物联网平台(如阿里云、OneNet),实现远程设置提醒、服药状态反馈等功能,进一步提升智能化水平。该装置能有效解决老人忘服药问题,具有较高的实用价值与推广潜力。

weixin_42300449的博客 1043

【云原生技术】SonarQube 生态中PMD插件和P3C插件详细介绍

4. 在项目中如何选择 / 组合 1. 小团队、对《阿里规约》认同度高 → 直接启用 **P3C**,配合 SonarJava 基本够用。 2. 追求全面 Bug/安全检测 + 额外编码规范 → **SonarJava + PMD**(必要时加 P3C 少量规则)。 3. 大型多团队,希望“一本规约”统一风格 → **P3C 为主**,再补充 SonarJava/PMD 的 Bug 与安全规则。 4. 通过 Quality Gate 控制:将 **Blocker/Critical** Bug

weixin_46453070的博客 1364

多线程依次执行

多线程依次执行 A线程执行完再执行B线程再执行C线程再执行线程 class MyService2 { private Lock lock = new ReentrantLock(); private Lock lock1 = new ReentrantLock(); private Lock lock2 = new ReentrantLock(); public void printA() { try { lock.lock();

qq_42938213的博客 502

基于YOLOv10的机器人抓取引导系统:从物体检测到精准抓取

python# 数据标注工具简化版import os"""启动标注工具""""""标注单张图像"""print(f"标注图像: {os.path.basename(img_path)}")print("请在图像上绘制抓取矩形框...")# 这里应该实现交互式标注界面# 简化版本直接返回示例标注# 示例标注数据"""保存标注结果"""# 保存为YOLO格式# 转换为YOLO格式。

YOLO 377

线程a要等待线程b执行完毕再执行

在C++ Qt中,可以使用QThread类和信号槽机制来实现线程之间的等待和同步。

m0_69644480的博客 343

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C#子线程执行完后通知主线程的方法

怎么让子线程去做主线程的事儿呢,我们只需要把主线程的方法传递给子线程就行了,那么传递方法就很简单了委托传值嘛; 下面有一个例子,子线程干一件事情,做完了通知主线程 public class Program { //定义一个为委托 public delegate void Entrust(string str); static void Main(string[] args)...

极客神殿 6541

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

线程池任务执行完毕后如何自动通知?揭秘ThreadPoolExecutor CompletionService核心原理

掌握ThreadPoolExecutor的完成回调机制,轻松实现任务结束自动通知。适用于高并发场景,通过CompletionService统一管理异步任务结果,避免轮询、提升效率。核心原理+代码示例详解,值得收藏。

CodePulse的博客 1055

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

几种等待多线程任务执行完毕的方法

CountDownLatch和Cyclicbarrier概念、区别及原理 1、概念   CountDownLatch:具有计数器的功能,等待其他线程执行完毕,主线程在继续执行,用于监听某些初始化操作,并且线程进行阻塞,等初始化执行完毕后,通知主线程继续工作执行。值得注意的是CountDownLatch计数的次数一定要与构造器传入的数字一致,比如构造器传入的是3,则countDown()一定要执行3次,否则线程将一直阻塞。CountDownLatch通常用来控制线程等待,它可以让线程等待倒计时结束,.

MayMatrix 的博客 7039

线程间事件通知

事件通知 有的时候我们需要事件通知的场景,比如A线程注册了一个异步的回调,开始处理某些流程,这个时候该处理完毕的都处理完毕了,开始等待回调的结果。B线程进行I/O,I/O完毕进行回调然后填充A线程注册回调时传递的参数。这个时候B线程工作完毕是需要通知A线程,它已经干完毕了A线程可以继续下面的步骤了。 那么这个时候就可以进行事件通知了。 事件通知方式 下面三种方式都可以进行事件通知 pipe pt...

我喜欢雨天的清新的博客 1952

java 线程执行完毕_java多线程实现主线程等待所有子线程执行完毕

最近项目中用到线程框架,需要主线程等待所有子线程执行完毕,小编突发奇想,结合设计模式中的复合模式和装饰模式写了这个deamo,这个例子最大的特点是,它不但可以实现最基本的需求,它还拥有像junit一样灵活的使用方法。以下是源代码和详解:importjava.util.List;importjava.util.Vector;publicclassThreadSuiteextendsThread{p...

weixin_31629913的博客 223

【A2B】【应用集成】

可以基于⽰例插件开发⾃定义插件来⽀持新的 A2B 硬件。堆栈插件必须导出表 5 中所⽰的⼀组函数。插件的典型 a2b_pluginInit() 函数如下所⽰:其他插件功能的实现细节可以在⽂件.\a2bpluginslave\src\a2bslave_plugin.c.中参考。

奔跑吧 android 的博客 1200

【多线程】线程通信之等待/通知机制

一、概念        线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体。线程间的通信就是成为整体的必用方案之一。可以说,使线程进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使开发人员对各线程任务在处理的过程中进行有效的把控和监督。 二、线程的执行模式        1、互不通信的多线程模式        多个线程会在系统中并发执行。线程

柠檬树 2283

java互斥锁同步执行两个线程函数(附带源码)

java互斥锁同步执行两个线程函数(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1125

线程顺序执行的8种方法,最后一种你用过吗?

本文主要介绍了多线程如何执行顺序

张小凡 9971

线程间通信(等待/通知机制的实现)

在多线程中什么是等待通知机制?生活总最常见的例子就是上菜系统

飞少fly的博客 595

面试题:【多线程问题,三个线程A,B,C;C线程依赖B线程的结果执行,怎么控制】

多线程问题,三个线程A,B,C;C线程依赖B线程的结果执行,怎么控制

qq_44313636的博客 950

线程优化,2个线程,一个线程打印基数,一线程打印偶数,让两个线程交替打印出连续的数

线程1能打印出:0,2,4,6,8,,线程2能打印出1,3,5,7,9 需求:打印出1,2,3,4,5,6,7,8,9 程序入口 //参看消费和生产 https://blog.youkuaiyun.com/XiaopinOo/article/details/76630973 public class TestThread { public static void main(String[] args) { ...

qq_41767337的博客 675
上一篇: cson beta
下一篇: 一个有意思的类型实现,可惜是个半成品
FlyAnyWhere
博客等级 码龄24年 5粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值