“java”中多线程按行读取txt且每个线程读的内容不能重复,这么求“demo”?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“java”中多线程按行读取txt且每个线程读的内容不能重复,这么求“demo”?相关的知识,希望对你有一定的参考价值。

参考技术A public class Test\\x0d\\x0a public static void main(String args[])throws Exception\\x0d\\x0a File file = new File("D:\\Test.java");//Text文件\\x0d\\x0a BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件\\x0d\\x0a String s = null;\\x0d\\x0a while((s = br.readLine())!=null)//使用readLine方法,一次读一行\\x0d\\x0a System.out.println(s);\\x0d\\x0a \\x0d\\x0a br.close();;\\x0d\\x0a \\x0d\\x0a

Java中多线程通信怎么实现

线程通信的方式:

  1、共享变量

      线程间通信可以通过发送信号,发送信号的一个简单方式是在共享对象的变量里设置信号值。线程A在一个同步块里设置boolean型成员变量hasDataToProcess为true,线程B也在同步代码块里读取hasDataToProcess这个成员变量。这个简单的例子使用了一个持有信号的对象,并提供了set和get方法。

  

public class MySignal1 {
    //共享的变量
    private boolean hasDataToProcess = false;

    //取值
    public boolean getHasDataProcess() {
        return hasDataToProcess;
    }

    //存值
    public void setHasDataToProcess(boolean hasDataToProcess) {
        this.hasDataToProcess = hasDataToProcess;
    }

    public static void main(String[] args) {
        //同一个对象
        final MySignal1 my = new MySignal1();
        //线程1设置hasDataToProcess值为true
        final Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                my.setHasDataToProcess(true);
            }
        });
        t1.start();
        //线程2取这个值hasDataToProcess
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //等待线程1完成后取值
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                my.getHasDataProcess();
                System.out.println("t1改变以后的值:"+my.getHasDataProcess());
            }
        });
        t2.start();
    }
}

运行结果如下:

  

t1改变以后的值:true

 

  2、等待/唤醒(wait/notify)机制

     以资源为例,生产者生产一个资源,通知消费者就消费掉一个资源,生产者继续生产资源,消费者消费资源,以此循环,代码如下。

import sun.security.util.Password;

//资源类
class Resource {
    private String name;
    private int count = 1;
    private boolean flag = false;

    public synchronized void set(String name) {
        //生产资源
        while (flag) {
            try {
                //线程等待
                wait();
            } catch (InterruptedException e) {
            }
        }
        this.name = name + "----" + count + "+++++";
        System.out.println(Thread.currentThread().getName() + "..生产者..." + this.name);
        flag = true;
        //唤醒等待中的消费者
        this.notifyAll();
    }

    public synchronized void out() {
        //消费资源
        while (!flag) {
            try {
                //线程等待,生产者生产资源
                wait();
            } catch (InterruptedException e) {
            }
        }
        System.out.println(Thread.currentThread().getName() + "...消费者..." + this.name);
        flag = false;
        //唤醒消费者,生产资源
        this.notifyAll();
    }
}

//生产者
class Producer implements Runnable {
    private Resource rs;

    public Producer(Resource rs) {
        this.rs = rs;
    }

    //生产者生产资源
    @Override
    public void run() {
        while (true) {
            rs.set("商品");
        }
    }
}

//消费者消费资源
class Consumer implements Runnable {
    private Resource rs;

    public Consumer(Resource rs) {
        this.rs = rs;
    }

    //消费者消费资源
    @Override
    public void run() {
        while (true) {
            rs.out();
        }
    }
}

public class ProducerConsumerDemo {
    public static void main(String[] args) {
        Resource r = new Resource();
        Producer p = new Producer(r);
        Consumer c = new Consumer(r);
        Thread t1 = new Thread(p);
        Thread t2 = new Thread(c);
        t1.start();
        t2.start();
    }
}

运行结果如下:

Thread-0..生产者...商品----1+++++
Thread-1...消费者...商品----1+++++
Thread-0..生产者...商品----1+++++
Thread-1...消费者...商品----1+++++
Thread-0..生产者...商品----1+++++
Thread-1...消费者...商品----1+++++
Thread-0..生产者...商品----1+++++

 

以上是关于“java”中多线程按行读取txt且每个线程读的内容不能重复,这么求“demo”?的主要内容,如果未能解决你的问题,请参考以下文章

java 多线程读取txt 文件

Java中多线程通信怎么实现

java中多线程地并发运行是啥意思?有啥作用.好处?

volatile写读的内存语义

java 按行读取txt文件的数字

67.文件映射为内存进行操作与多线程 以及 文件映射到内存根据索引进行内存来实现读取多线程操作