`
li8754528
  • 浏览: 5208 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一道线程交替读取的面试题

    博客分类:
  • Java
阅读更多
有两个单词的txt文本a.txt和b.txt,a是以换行区分单词,b是 换行或者空格符。写一个程序,交替读取a和b文件中的单词保存在文件c中。
代码如下:
package com.kaiying.face;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class FileWriteAndReadTest {
	private Lock lock = new ReentrantLock();
	private Condition condition = lock.newCondition();
	private Condition otherCondition = lock.newCondition();
	private OutputStream out;
	private boolean turnA = true;//读A  false 读B文件
	private boolean empty = false;//判断有一个文件的单词全部读完

	public FileWriteAndReadTest() {
		try {
			out = new FileOutputStream("d.txt");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	class ReadFileA implements Runnable {

		public void run() {
			try {
				lock.lock();
				InputStream in = new FileInputStream("a.txt");
				int r = 0;
				while ((r = in.read()) != -1) {
					while (!turnA) {
						otherCondition.await();
					}
					writeByte(r);
					if (r == 10) {// 换行
						if (!empty) {
							turnA = false;
							System.out.println("A");
							condition.signal();
						}
					}
				}
				turnA = false;
				empty = true;
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				lock.unlock();
			}
		}
	}

	class ReadFileB implements Runnable {

		public void run() {
			try {
				lock.lock();
				InputStream in = new FileInputStream("b.txt");
				int r = 0;
				while ((r = in.read()) != -1) {
					while (turnA) {
						condition.await();
					}
					writeByte(r);
					if (r == 10 || r == 32) {// 换行  空格
						if (!empty) {
							System.out.println("B");
							turnA = true;
							otherCondition.signal();
						}
					}
				}
				turnA = true;
				empty = true;
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				lock.unlock();
			}
		}
	}

	public void writeByte(int byteWord) {
		try {
			out.write(byteWord);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		FileWriteAndReadTest test = new FileWriteAndReadTest();
		ReadFileA fileA = test.new ReadFileA();
		ReadFileB fileB = test.new ReadFileB();
		new Thread(fileA).start();
		new Thread(fileB).start();
	}
}


分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    C#面试题 包括 ADO.net 多线程等

    C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等

    多线程面试题

    本文将围绕“多线程面试题”这一主题,深入探讨相关概念、技术及其应用。 1. **线程的概念**:线程是程序执行的最小单位,一个进程可以有多个线程同时执行任务,提高了程序的运行效率。 2. **Java中的线程创建方式...

    10万字总结java面试题和答案(八股文之一)Java面试题指南

    多线程&并发面试题 JVM面试题 Mysql面试题 Redis面试题 Memcached面试题 MongoDB面试题 Spring面试题 Spring Boot面试题 Spring Cloud面试题 RabbitMQ面试题 Dubbo 面试题 MyBatis 面试题 ZooKeeper 面试题 数据结构...

    Java面试题、JVM面试题、多线程面试题、并发编程、设计模式面试题

    Java面试题、JVM面试题、多线程面试题、并发编程、设计模式面试题、SpringBoot面试题、SpringCloud面试题、MyBatis面试题、Mysql面试题、VUE面试题、算法面试题、运维面试题。 收集汇总各行业笔试or编程题解题思路 ...

    java经典多线程面试题

    以下是一些经典的多线程面试题知识点: 1. Java中的线程状态有哪些? - 新建状态(New):线程对象创建后,但尚未启动。 - 就绪状态(Runnable):处于就绪状态的线程随时可能被CPU调度执行。 - 运行状态...

    线程面试题

    ### Java线程面试题知识点详解 #### 一、线程基本概念 1. **什么是线程?** - 线程是操作系统中能够独立运行的最小单位,它被包含在一个进程中,是进程中的实际执行单元。通过多线程编程可以有效利用多核处理器...

    2023最新JAVA面试题集

    2023年最新版--Java+最常见的+200++面试题汇总+答案总结汇总 阿里百度美团面试题合集 大数据面试题 100道 多线程面试59题(含答案) 最新JAVA面试题总结之基础/框架/数据库/JavaWeb/Redis BIO,NIO,AIO,Netty面试题 ...

    哈哈iOS多线程面试题

    在探讨iOS多线程的面试题目时,我们首先要明确进程和线程的定义及其关系。进程可以被理解为计算机上一次执行活动的程序,它是操作系统分配资源的基本单元,拥有独立的内存空间和运行所需的全部资源。当我们提到一个...

    73道Java面试题合集-多线程与进程

    以下是对73道Java面试题合集——多线程与进程相关知识点的详细解释。 1. **进程与线程的概念**: - **进程**:是操作系统资源分配的基本单位,拥有独立的内存空间和系统资源,可以并发执行。 - **线程**:是程序...

    java面试题_多线程(68题).pdf

    Java中的多线程是面试中常见的话题,涵盖了操作系统的基础概念以及Java并发库的高级特性。以下是对这些知识点的详细解释: 1. **线程**:线程是操作系统调度的基本单元,一个进程中可以有多个线程并发执行。在多...

    java多线程面试题和答案

    以下是一些关于Java多线程的面试题及其答案,涵盖了基础概念、并发控制、线程安全以及性能优化等方面。 1. **什么是Java多线程?** 多线程是指在单个程序中同时执行多个线程,这样可以提高应用程序的效率和响应...

    多线程,多线程面试题,C#源码.zip

    对于C#开发者来说,理解和掌握多线程技术不仅能够优化代码性能,也是面试中常被问到的知识点。 首先,我们要理解什么是线程。线程是操作系统分配CPU时间的基本单元,一个进程可以包含一个或多个线程。主线程通常...

    Java面试题、JVM面试题、多线程面试题

    标题提到的是"Java面试题、JVM面试题、多线程面试题",而描述和标签却提及"python编程"。不过,既然您希望聚焦于"Java面试题、JVM面试题、多线程面试题",我将为您详细介绍这些主题。 **Java面试题** 1. **Java是...

    C# 多线程互斥 两个线程交替工作

    对于两个线程交替工作,一个常见的应用场景是控制两个线程按照一定的顺序执行,比如线程A执行一次,然后线程B执行一次,如此循环。以下是一种可能的实现方法: 1. 使用`ManualResetEvent`或`AutoResetEvent`对象...

    Java线程面试题Top50[参照].pdf

    Java 线程面试题 Top 50 Java 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。 一、什么是...

    c++笔试面试之网络和多线程

    在C++笔试面试中,网络和多线程是两个经常被提及的重要知识点。本篇文档详细列举了关于网络部分的面试题目,同时也涉及了与多线程相关的TCP/IP协议栈的建立和断开过程。以下为详细的知识点总结: 1. TCP服务创建...

    2022年最新iOS面试题附答案.docx

    iOS 面试题附答案 本文主要讲解 iOS 面试题的相关知识点,包括类和结构体的区别、GCD 的概念和使用等。 类和结构体的区别 在 Swift 中,类是引用类型,结构体是值类型。值类型在传递和赋值时将进行复制,而引用...

    面试题c++mysql多线程操作系统面试题c++mysql多线程操作系统面试题c++mysql多线程操作系统

    在准备面试时,阅读《TCP/IP详解》等相关文档(如tcp.docx)将帮助你深入理解网络通信协议,而《多线程》(多线程.docx)和《C++》(c++.docx)文档将覆盖上述关于C++和多线程的内容。《面向对象的三个特征》(面向...

    答复: 一道经典线程面试题的4种解法

    标题中的“答复: 一道经典线程面试题的4种解法”暗示了这是一个关于多线程编程的问题,通常在面试中出现,用于评估候选人的并发处理能力。在这个问题中,可能涉及到同步、线程安全、锁机制等关键概念。 在Java中,...

Global site tag (gtag.js) - Google Analytics