《多线程总结篇》《多线程向一个数组里面添加数据》

一、基础

1.线程实现的三种方式

1.继承Thread类
2.实现Runnable接口
3.实现callable接口

2.线程停止stop()、线程休眠sleep()、线程礼让yield()、线程插队join()

3.线程的5大状态getState()

1.新建
2.就绪
3.运行
4.阻塞
5.死亡

4.线程的优先级getPriority()、setPriority()

设置优先级增加在cpu那里的权重

5.用户线程、守护线程

用户线程:main()
守护线程:gc()
虚拟机必须确保用户线程执行完毕,不必等待守护线程执行完毕

二、多线程同步解决

1.多个线程操作同一个资源,加锁synchronized、或者同步块synchronized(object){}实现线程同步、或者使用线程安全的对象

使用synchronized(object){}时,object为变化的量,默认是this

例子:使用多个线程向数组中添加数据

package com.css.apps.base.dict.service;

import java.util.ArrayList;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * zt
 * 2021/6/17
 * 14:50
 */
public class TestDemo2 {
    /*public static void main(String[] args) {
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        for (int i = 0; i < 10000; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    list.add(Thread.currentThread().getName());
                }
            }).start();
        }
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(list.size());
    }*/
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized (list){
                        list.add(Thread.currentThread().getName());
                    }
                }
            }).start();
        }
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(list.size());
    }

}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C#代码示例,演示如何使用多线程导出Excel: ```csharp using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using OfficeOpenXml; public class ExcelExporter { private readonly int threadCount; // 线程数 private readonly int batchSize; // 每个线程处理的数据块大小 private readonly int rowCount; // 数据行数 private readonly int columnCount; // 数据列数 private readonly string[,] data; // 二维数组数据 private readonly string filePath; // Excel文件路径 public ExcelExporter(int threadCount, int batchSize, int rowCount, int columnCount, string[,] data, string filePath) { this.threadCount = threadCount; this.batchSize = batchSize; this.rowCount = rowCount; this.columnCount = columnCount; this.data = data; this.filePath = filePath; } public void Export() { using (var package = new ExcelPackage()) { var worksheet = package.Workbook.Worksheets.Add("Data"); var taskList = new List<Task>(); for (int i = 0; i < threadCount; i++) { var startIndex = i * batchSize; var endIndex = Math.Min(startIndex + batchSize, rowCount); var task = Task.Factory.StartNew(() => { for (int j = startIndex; j < endIndex; j++) { for (int k = 0; k < columnCount; k++) { worksheet.Cells[j + 1, k + 1].Value = data[j, k]; } } }); taskList.Add(task); } Task.WaitAll(taskList.ToArray()); package.SaveAs(new System.IO.FileInfo(filePath)); } } } ``` 在上面的代码,我们创建了一个ExcelExporter类,它接受线程数、数据块大小、二维数组数据和Excel文件路径等参数,并使用多线程方式将数据写入Excel文件。在Export方法,我们首先创建了一个ExcelPackage实例,并添加一个名为“Data”的工作表。然后,我们使用Task.Factory.StartNew方法创建了多个任务,每个任务负责处理一个数据块。任务使用嵌套的循环遍历数据块并将数据写入Excel。最后,我们使用Task.WaitAll方法等待所有任务完成,然后将Excel文件保存到指定路径。 请注意,上面的代码示例仅用于演示多线程导出Excel的基本思路,实际应用可能需要根据具体情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值