首页 > 其他分享 >外界参数控制多线程队列进行与否

外界参数控制多线程队列进行与否

时间:2023-03-19 17:35:27浏览次数:36  
标签:java 队列 与否 util import new 多线程 public

业务场景,最近遇到个需求,就是通过点击开始/继续要控制任务进度,
刚开始想到了线程wait,notify
本人是个比较懒得人,一想到要写那么多代码空值,要等待,唤醒,睡眠啥的就觉得麻烦,出现调度执行问题好不好排查。
于是想到了Queue,它里面有java  的lock能帮助我,于是有了如下的代码
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,final 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)); // // } }

 

标签:java,队列,与否,util,import,new,多线程,public
From: https://www.cnblogs.com/wangbiaohistory/p/17233707.html

相关文章

  • JUC提供了哪些阻塞队列
    阻塞队列的处理方法阻塞队列实现了BlockingQueue接口,并且有多组处理方法。抛出异常add方式是往队列里面添加元素,如果队里队列满了,会抛出异常remove方法是删除元素,如......
  • 说说对AQS(AbstractQueuedSynchronizer)队列同步器的理解
    AQS是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等),包含了实现同步器的细节(获取同步状态、FIFO同步队列)。AQS的主要使用......
  • CAS 是一种什么样的同步机制?多线程下为什么不使用 int 而使用 AtomicInteger?
    CompareAndSwap,比较交换。可以看到synchronized可以保证代码块原子性,很多时候会引起性能问题,volatile也是个不错的选择,但是volatile不能保证原子性,只能在某些场合下使......
  • 优先队列(PriorityQueue)常用方法及简单案例
    1前言PriorityQueue是一种特殊的队列,满足队列的“队尾进、队头出”条件,但是每次插入或删除元素后,都对队列进行调整,使得队列始终构成最小堆(或最大堆)。具体调整如下:插入......
  • 【RabbitMQ消息中间件】11.持久化和非持久化队列
    上一篇介绍并搭建了Spring-Rabbit工程,并且创建了一个名为MyQueue的队列。下面补充一个有关持久化和非持久化队列的知识点。登录RabbitMQ的图形化管理界......
  • 多线程篇-交替打印
    背景有如下需求:线程1打印5次a,线程2打印5次b,线程3打印5次c,要求最后的结果是abcabcabcabc步骤简单情况先考虑简单的情况,然后进行拓展。简单版需求:线程1打印1,线程2......
  • Day 17 17.3 多线程实现之线程池
    多线程实现之线程池1引入系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互。在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量......
  • 多线程编程五:信号量
    2.33.信号量的概念_哔哩哔哩_bilibili2.34.信号量的工作机制_哔哩哔哩_bilibili......
  • 3.7 队列的表示和实现
    3.5队列的表示和操作实现相关术语队列(Queue)是仅在表尾进行插入操作,在表头进行删除操作的线性表。表尾及a(((((n)))))端,称为队尾;表头即a(((((1)))))端称为......
  • 3.8 队列的顺序表示和实现
    3.5.2队列的顺序表示和实现队列的物理存储可以用顺序结构,也可用链式存储结构,相应地队列的存储方式也分为两种,即顺序队列和链式队列、队列的顺序表示——————......