当前位置: 首页 > 知识库问答 >
问题:

如何在java中使用三个线程同时读取文件?

空俊语
2023-03-14

我的程序如下:

import java.io.*;
class MyThread implements Runnable{
    int st,en;
    LineNumberReader lmr1;
    BufferedWriter bw;
        MyThread(int s,int e){
        st=s;
        en=e;
    } 
    public void run(){

        try{

                bw=new BufferedWriter(new FileWriter("EmpWritten.txt"));
                            lmr1=new LineNumberReader(new FileReader("out3.txt"));
                String s=Thread.currentThread().getName();
                            lmr1.skip(st);
                while(st++<en){
                        bw.write(s+"\t"+lmr1.readLine());
                        bw.newLine();

                }
            lmr1.close();
            bw.close();
        }
        catch(Exception e){}

}
    public static void main(String args[])throws Exception{
        LineNumberReader lmr=new LineNumberReader(new FileReader("out3.txt"));
        lmr.skip(Long.MAX_VALUE);
        int num=lmr.getLineNumber();
        int num1=num/3,num2=2*num1;

        MyThread mt1=new MyThread(0,num1);
        MyThread mt2=new MyThread(num1+1,num2);
        MyThread mt3=new MyThread(num2+1,num);

        Thread t1=new Thread(mt1);
        Thread t2=new Thread(mt2);
        Thread t3=new Thread(mt3);

        t1.start();
        t2.start();
        t3.start(); 


        lmr.close();
    }
}

输入:

提交ID名称薪资部门编号
提交ID1名称1 25100部门1
提交ID2名称2 25200部门2
提交ID3名称3 25300部门3
提交ID4名称4 25400部门4
提交ID5名称5 25500部门5
提交ID6名称6 25600部门6
提交ID7名称7 25700部门7
提交ID8名称8 25800部门8
提交ID9名称9 25900部门9
提交ID10名称10 26000部门10

输出:

Thread-2 ID Name工资部门编号Thread-2 Commit ID1 Name1 25100 Dept1
Thread-2 Commit ID2 Name2 25200 Dept2
Thread-2 Commit ID3 Name3 25300 Dept3

为什么其他线程不执行?需要做哪些修改才能获得所需的输出?该计划的有效实施也受欢迎。

共有1个答案

归鹤龄
2023-03-14

三条线起作用了。在run方法中添加一些日志后可以看到它。我不确定你到底想要什么。但我认为你们需要生产者-消费者的设计模式。

 类似资料:
  • 我有两个输入文件,分别是File1和File2。File1包含部分记录,其余部分记录分散到File2,为了创建一条记录,我需要同时读取File1和File2。每条记录的唯一键将位于记录之前的File1和File2中。请您帮助我们如何使用Spring batch reader实现此功能。

  • 我是Spring框架的新手,我正在使用Spring做一个简单的项目,但介于两者之间。在我的项目中,我使用Spring Poller从目录中读取文件。然后通过各种通道处理该文件并将其发送到队列。但问题是“file-inbing-channel-适配器”(我正在使用)一次只读取一个文件。所以我需要一个一次读取和处理多个文件的解决方案。有没有办法在Spring集成中实现多线程。谢谢你。

  • 问题内容: 我了解对于普通的主轴驱动器系统,使用多个线程读取文件效率很低。 这是另一种情况,我有一个高吞吐量的文件系统可供使用,它具有196个CPU内核和2TB RAM的读取速度高达3GB / s。 单线程Java程序以最大85-100 MB /s的速度读取文件,因此我有可能变得比单线程更好。我必须读取最大1TB的文件,并且有足够的RAM来加载它。 当前,我使用以下内容或类似内容,但需要使用多线程

  • 问题内容: 阅读部分不是并发的,但处理是并发的。我用这种方式来命名标题,因为我最有可能使用该短语再次搜索此问题。:) 尝试 超越示例 之后,我陷入僵局,因此这对我来说是一种学习经验。我的目标是: 逐行读取文件(最终使用缓冲区执行多行)。 将文本传递给执行某些正则表达式的工作。 将结果发送到某个地方,但要避免使用互斥或​​共享变量。我正在将整数(总是数字1)发送到通道。这有点愚蠢,但是如果不引起问题

  • 首先,我在编码方面是个新手,所以我为我可能犯的任何隐语错误道歉 我正在使用Java(openJDK11)和Spring boot开发后端服务器: 该应用程序由许多面板和子面板组成,这些面板和子面板从web浏览器打开。单击子面板时,在前端执行三个不同的GET请求。 这三个请求需要不同的响应(json模式、json数据等)。每个请求启动一个访问相同配置文件的不同线程(每个子面板有一个配置文件),该配置

  • 问题内容: 程应在同一瞬间开始。我了解,如果你这样做,则下次执行之前需要花费几毫秒的时间。 可能还是不可能?线程应该在同一瞬间开始。我知道,如果你执行,则下次执行thread2.start()需要几毫秒。 这是可能的还是不可能的? 问题答案: 要完全同时(至少尽可能好)启动线程,可以使用CyclicBarrier: 这不必是,你也可以使用 这仍然无法确保它们已正确启动 在其他平台上,确切地说启动线