首页 > 其他分享 >多线程队列接收

多线程队列接收

时间:2023-03-30 23:58:03浏览次数:40  
标签:接收 队列 util import ArrayBlockingQueue new 多线程 public

package org.example.file.mult;
//函数值接口
@FunctionalInterface
public interface FuncationCallback {
    void callback(String param);
}

 

回调接收

 

package org.example.file.mult;

import java.util.ArrayList;

public class FuncationCallbackImpl {
   //函数式 回调参数处理
    public FuncationCallbackImpl(ArrayList arrayList,  FuncationCallback funcationCallback) {
        arrayList.forEach(ele->{
            funcationCallback.callback(ele+"456789");
        });

    }
}

 

队列业务实现

 

package org.example.file.mult;


import org.apache.tomcat.util.threads.TaskThreadFactory;

import java.util.ArrayList;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Securite {
    //有界队列,根据实际业务设置即可
    public static ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);
   //静态线程池,一会多线程执行能用到,根据自己的机器性能配置即可
    public static Executor executor = new ThreadPoolExecutor(3, 10, 2000, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10), new TaskThreadFactory("测试队列", false, 7));

    public Securite() {
    }


    public void exec(Integer ele) {
        queue.offer(ele);
    }
    //全局静态 内存可见性常量,空值任务暂停使用
    public static volatile int a = 0;//刷回主内存

    //静态内部类,有利于在主程序空值进度
    public static class MultTask implements Runnable {


        private ArrayBlockingQueue<Integer> arrayBlockingQueue1;
        //线程-队列构造器  便于每个线程都能冲全局队列取值
        public MultTask(ArrayBlockingQueue<Integer> arrayBlockingQueue1) {
            this.arrayBlockingQueue1 = arrayBlockingQueue1;
        }


        @Override
        public void run() {
            //循环,这里要注意和arrayBlockingQueue1.take()配合使用,避免空悬打满cpu
            while (true) {
                try {
                    //当参数等于8时,后面的线程停止取队列的元素进行操作,来达到外界可控的目的
                    if (a == 8) {
                        System.out.println("开始终端了");
                        Thread.sleep(5000);
                        System.out.println("5秒后继续");
//                        a = 51;
                        return;
                    }
                    Integer take = arrayBlockingQueue1.take();
                    String name = Thread.currentThread().getName();
                    ArrayList arrayList = new ArrayList();
                    arrayList.add(take);
                    //队列每次取值后再回调函数里处理后的值
                    new FuncationCallbackImpl(arrayList, new FuncationCallback() {
                        @Override
                        public void callback(String param) {
                            System.out.println("返回param:" + param);
                        }
                    });
                    //TODO 根据自己的业务进行后续处理
                    System.out.println(">>>>>>>>>>>>>>>>>>>>>:" + take + "<><><><><><><>:" + name);
                } catch (InterruptedException e) {
                }

            }
        }
    }
    public static void main(String[] args) throws InterruptedException {
        Securite securite = new Securite();
        for (int i = 0; i < 10; i++) {
            if (i == 8) {
                a = 8;
            }
            securite.exec(i);
            executor.execute(new MultTask(queue));

        }
        System.out.println("10s后在运行一次");
        Thread.sleep(1500);
        securite.exec(10);
        executor.execute(new MultTask(queue));

    }
}

 

标签:接收,队列,util,import,ArrayBlockingQueue,new,多线程,public
From: https://www.cnblogs.com/wangbiaohistory/p/17274823.html

相关文章

  • Moveit使用话题通信接收目标位姿解算时ROS节点卡死
    使用话题通信接收目标位姿,然后将目标位姿传入moveit的setposetarget中进行逆解算,但是程序卡死在了plan函数中。解决办法,将单线程换成多线程。也就是,将ros::AsyncSpinnerspinner(1);换成ros::AsyncSpinnerspinner(2);就不会再卡死。......
  • Python 脚本接收命令行参数的多种方式 All In One
    Python脚本接收命令行参数的多种方式AllInOnesysargparseshellscripttensorflow...sys#!/usr/bin/envpython3#coding:utf8importsysargs=sys.argvprint("argslength:",len(args))print("argstype:",type(args))print("fu......
  • C#:多线程
    在C#中,多线程是一种非常常见的编程方式,它可以提高程序的并发性和响应性。但是,多线程编程也是一种比较复杂的编程方式,需要开发者具备一定的经验和技能。本文将介绍C#中多......
  • 多线程源码_三菱plc+卡+串口上位机
    多线程源码_三菱plc+卡+串口上位机1,采用C#编程。2,上位机采用RS232串口通信链接plc。3,PLC为三菱。4,研华采集卡,采集压装电压。5,曲线判据自定义。6,每天作业......
  • 【Redis】多线程Redis的N种架构
    【Redis】多线程Redis的N种架构为什么需要多线程的Redis在单点上利用更多的资源--热点资源官方的多线程只看左边部分其实还是单线程的形式,设置io Thread的数量==》......
  • 循环队列(顺序)的实现:舞伴问题
    一、问题引入舞伴配对问题:假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头各出一人配成舞伴。若两队初始人数不相同,则较长的......
  • 多线程 互斥锁与读写锁 概念
    一、多线程lock互斥锁简述多线程环境中,不使用lock锁,会形成竞争条件,导致A线程与B线程数据使用冲突。使用lock锁可以保证当有线程操作某个共享资源时,能使该代码块按照指......
  • 多线程socketserver
    模块:socketservertcp协议:服务端:importsocketserverclassMyRequestHandle(socketserver.BaseRequestHandler):defhandle(self):#print(self.request)#......
  • 面试题59 - II. 队列的最大值(剑指offer)
    题目描述:请定义一个队列并实现函数max_value得到队列里的最大值,要求函数max_value、push_back和pop_front的均摊时间复杂度都是O(1)。若队列为空,pop_front和max_v......
  • 进程消息队列实例
    //write.c#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#include<stdio.h>structmymesg{longmtype;//消息的类型,是一个整数且大于0......