首页 > 编程语言 >java多线程 读取list--动态读取list

java多线程 读取list--动态读取list

时间:2024-04-17 15:44:37浏览次数:24  
标签:读取 list System 线程 多线程 data public

java多线程 读取list--动态读取list的案例

  本次介绍,我使用的是synchronized 同步代码块的关键字来读取list,在写java多线程时,一定要注意
synchronized 关键字的有效范围。
ps:
如果synchronized 关键字的代码块范围太大,可能会导致 优先获取到cpu资源的第一个线程 在满足条件的情况下 一直无法跳循环,从而使得其他线程
无法给获取到被cpu调度的机会,造成:想“多线程执行代码块”的预期-》演变成了 “单线程一路走到黑 执行代码块”的惨象,也就是让多线程的预期 实际变成了单线程了。
以下 我就用1个错误的例子,和一个正确的例子给大家介绍以下吧:

1.错误的例子:实际是单线程 执行synchronized代码块的内容:

package com.cdncp.testautomation.control.conf;
import java.util.ArrayList;
import java.util.List;

public class Test_4 {
    /**
     * 多线程处理list
     *
     * @param data      数据list
     * @param threadNum 线程数
     */
    public void handleList(List<String> data, int threadNum) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < threadNum; i++) {
            HandleThread thread = new HandleThread("线程[" + (i + 1) + "] ", data);
            thread.start();
            System.out.println("thread name:" + thread.getName());
        }

        long end = System.currentTimeMillis();
        System.out.println("time:" + (end - start));
    }

    public static void main(String[] args) {
        Test_4 test = new Test_4();
        // 准备数据
        List<String> data = new ArrayList<String>();
        for (int i = 0; i < 40; i++) {
            data.add("item" + i);
        }
        HandleThread.info = data;
        test.handleList(data, 10);
    }
}

第二个类:

package com.cdncp.testautomation.control.conf;
import java.util.List;

public class HandleThread extends Thread {
    public static List<String> info;

    private String threadName;
    private List<String> data;
    //静态钥匙
    static Object ob = "key"; //值是任意的

    public HandleThread(String threadName, List<String> data) {
        this.threadName = threadName;
        this.data = data;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (HandleThread.class) {
                try {
                   Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                if (info.size() > 0) {
                    System.out.println(this.threadName + ":  " + info.toString());
                    info.remove(info.get(0));
                } else {
                    System.out.printf("%s:票已售空 \n", getName());
                    break;
                }

            }
        }
    }
}

执行结果:

无法满足 按照我设定的线程数 去动态读取list(虽然读取数据是线程安全的,但是线程数不能按照预期创建的个数执行)

 

2.正确的例子:实现按照预定创建的 多线程 执行synchronized代码块的内容:

package com.cdncp.testautomation.control.conf;
import java.util.ArrayList;
import java.util.List;

public class Test_4 {
    /**
     * 多线程处理list
     *
     * @param data      数据list
     * @param threadNum 线程数
     */
    public void handleList(List<String> data, int threadNum) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < threadNum; i++) {
            HandleThread thread = new HandleThread("线程[" + (i + 1) + "] ", data);
            thread.start();
            System.out.println("thread name:" + thread.getName());
        }

        long end = System.currentTimeMillis();
        System.out.println("time:" + (end - start));
    }

    public static void main(String[] args) {
        Test_4 test = new Test_4();
        // 准备数据
        List<String> data = new ArrayList<String>();
        for (int i = 0; i < 40; i++) {
            data.add("item" + i);
        }
        HandleThread.info = data;
        test.handleList(data, 10);
    }
}

第二个类:

区别就是synchronized设置的代码块范围:

 

ps:

我创建了9个线程,这里也是个线程去执行代码块,获取list中的数据!!!

 

原因分析:

如果synchronized 关键字的代码块范围太大(其实本质还是 同步代码块没写对),可能会导致 优先获取到cpu资源的第一个线程 在满足条件的情况下 一直无法跳循环,那么这个线程就一直占用cpu资源,一直执行。
synchronized 关键字的代码块的特别是:同一时间就只能有一个线程去执行,只有等这个线程执行完毕这个代码块后,资源才会被释放,然后才能让其他线程去执行这个synchronized 关键字的代码块。
案例一中,就是因为这个原因,这就从而使得其他线程(即使我创建了9个线程,其实就只要小于9个线程在执行) 无法获取到被cpu调度的机会,其他线程也就不能执行了!!!

 

标签:读取,list,System,线程,多线程,data,public
From: https://www.cnblogs.com/pingguomang/p/18140906

相关文章

  • java多线程 读取变量同步安全的案例
    本次介绍,我使用的是synchronized同步代码块的关键字来读取list,在写java多线程时,一定要注意synchronized关键字的有效范围。ps:如果synchronized关键字的代码块范围太大,可能会导致优先获取到cpu资源的第一个线程在满足条件的情况下一直无法跳循环,从而使得其他线程无法给获......
  • 01 多线程
    线程,进程,多线程继承Thread类//创建线程方式一:继承Thread类,重写run()方法,调用start开启线程线程开始不一定立即执行,由CPU调度执行packagecom.mysoft.demo01;//创建线程方式一:继承Thread类,重写run()方法,调用start开启线程//总结:注意,线程开始不一定立即执行,由CPU调度执行pub......
  • (二)ET8多线程多进程框架设计课程介绍
    ET7已经满足90%的项目需求,没必要追新,除非客户端逻辑非常耗cpu,需要网络0GC,需要多线程支持(比如帧同步需要逻辑层单独放一个线程),服务端内部消息量过大或者需要减少总内存占用,才考虑使用ET8。ET8的课程明天开始录,主要讲解ET8多线程设计的各种思考,开发过程中的各种设计的权衡,et8相比ET7......
  • C++ list erase
    原文:https://www.cnblogs.com/yelongsan/p/4050404.htmlSTL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。      在使用list、set或m......
  • netcore 并发锁 多线程中使用SemaphoreSlim
    SemaphoreSlim是一个用于同步和限制并发访问的类,和它类似的还有Semaphore,只是SemaphoreSlim更加的轻量、高效、好用。今天说说它,以及如何使用,在什么时候去使用,使用它将会带来什么优势。代码的业务是:在多线程下进行数据的统计工作,简单点的说就是累加数据。1.首先我们建立一个程......
  • list集合的排序
    list集合的排序使用常用的sort方法排序和stream流的方式排序packagecom.liucy.meiriyilian.sort;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;importjava.util.List;importjava.util.stream.Collectors;/***@Authorli......
  • Python Flask+Pandas读取excel显示到html网页: CSS控制表格样式
    前言全局说明CSS控制表格样式一、安装flask模块二、引用模块三、启动服务模块安装、引用模块、启动Web服务方法,参考下面链接文章:https://www.cnblogs.com/wutou/p/17963563修改内容后,要重启flask服务,修改才能生效四、CSS控制表格样式4.1.2文件名:index.pyfrom......
  • Python Flask+Pandas读取excel显示到html网页:CSS控制表格样式
    前言全局说明一、安装flask模块二、引用模块三、启动服务模块安装、引用模块、启动Web服务方法,参考下面链接文章:https://www.cnblogs.com/wutou/p/17963563四、CSS控制表格样式4.1.2文件名:index.pyfromflaskimportFlaskapp=Flask(__name__)@app.route("/excel......
  • Python Flask+Pandas读取excel显示到html网页: 没有excle文件提示
    前言全局说明一、安装flask模块二、引用模块三、启动服务模块安装、引用模块、启动Web服务方法,参考下面链接文章:https://www.cnblogs.com/wutou/p/17963563四、没有excle文件提示4.1.2文件名:index.py添加tryexcept获取没有文件的异常fromflaskimportFlaskapp......
  • Python Flask+Pandas读取excel显示到html网页: 环境搭建显示内容
    前言全局说明一、安装flask模块二、引用模块三、启动服务模块安装、引用模块、启动Web服务方法,参考下面链接文章:https://www.cnblogs.com/wutou/p/17963563Pandas安装https://www.cnblogs.com/wutou/p/17811839.html四、环境搭建4.1.2文件名:index.pyfromflaskimp......