`

文件读写线程-交替执行wait(10)-线程不写在同一个类中,多线程

    博客分类:
  • java
 
阅读更多


package cn.thread.fen;

import java.io.IOException;

public class FileReadThread extends Thread{
 private CommThreadArgs args;
 public FileReadThread(CommThreadArgs args){
  this.args=args;
 }

 public void run() {
  try {
   synchronized(this) {
    while (args.getLen()!=-1) { //读完整个文件,len=-1
     if (args.getLen() != 0) {
      wait(10);
     }
     else{
      int length = args.getIs().read(args.getBuf(), 0, args.getBuf().length);
      args.setLen(length);
      System.out.println("----------"+length);
      notify();
     }
    }
   }
  } catch (IOException e) {
   e.printStackTrace();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
}

2.
package cn.thread.fen;

import java.io.IOException;

public class FileWriteThread extends Thread {
 private CommThreadArgs args;
 public FileWriteThread(CommThreadArgs args){
  this.args=args;
 }
 
 public void run() {
  synchronized(this){
  while(true){ 
   if(args.getLen()==0){
    try {
     wait(10);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
   else{
    System.out.println("*********"+args.getLen());
    if(args.getLen()==-1){ //读线程结束,写线程也结束
     try{
      args.getIs().close();
      args.getOs().close();
     } catch (IOException e) {
      e.printStackTrace();
     }
     break;
    }
    try {
     args.getOs().write(args.getBuf(), 0, args.getLen());
//     os.flush();
    } catch (IOException e) {
     e.printStackTrace();
    }

    args.setLen(0);
    notify();
   }
  }
  }
 }
}

3.
package cn.thread.fen;

import java.io.FileInputStream;
import java.io.FileOutputStream;

//线程公用的同一个实例,共用参数
public class CommThreadArgs {
 private FileInputStream is;
 private volatile byte[] buf;   //文件读写公用的缓存数据
 private volatile int len = 0;//读取的字符长度,公用
 private FileOutputStream os;

 /**
  *
  */
 public static void main(String[] args) {

  
 }

 public synchronized FileInputStream getIs() {
  return is;
 }

 public void setIs(FileInputStream is) {
  this.is = is;
 }

 public synchronized byte[] getBuf() {
  return buf;
 }

 public synchronized int getLen() {
  return len;
 }

 public synchronized void setLen(int len) {
  this.len = len;
 }

 public void setOs(FileOutputStream os) {
  this.os = os;
 }

 public synchronized FileOutputStream getOs() {
  return os;
 }

 public void setBuf(byte[] buf) {
  this.buf = buf;
 }
 
}

4.测试文件读写线程:
package cn.thread.fen;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class TestThread {

 /**
  *
  */
 public static void main(String[] args) throws Exception {

  CommThreadArgs ar=new CommThreadArgs();
  File file = new File("E:\\Log\\bc2.txt");
  int i=(int)(Math.random()*100);
  File of = new File("E:\\Log\\"+i+".txt");
  
  FileReadThread r = new FileReadThread(ar);
  ar.setIs(new FileInputStream(file));

  byte[] buf = new byte[512];
  ar.setBuf(buf);
  FileWriteThread w = new FileWriteThread(ar);
  ar.setOs(new FileOutputStream(of));

  r.start();  //起动读线程
  w.start(); //起动写线程
  
  Thread.currentThread().sleep(2000);
  
  CommThreadArgs ar2=new CommThreadArgs();
  File file2 = new File("E:\\Log\\814.txt");
  int i2=(int)(Math.random()*100);
  File of2 = new File("E:\\Log\\"+i2+".txt");
  
  FileReadThread r2 = new FileReadThread(ar2);
  ar2.setIs(new FileInputStream(file2));

  byte[] buf2 = new byte[512];
  ar2.setBuf(buf2);
  FileWriteThread w2 = new FileWriteThread(ar2);
  ar2.setOs(new FileOutputStream(of2));

  r2.start();  //起动读线程
  w2.start(); //起动写线程
 }

}

分享到:
评论

相关推荐

    多线程习题3.zip

    "多线程习题3.zip"可能是一个包含一系列多线程编程练习的压缩文件,用于帮助学习者提升在Java、Python、C++或其他支持多线程编程语言中的技能。 多线程允许一个程序同时执行多个任务,每个任务都在不同的线程上运行...

    第10章 多线程.docx

    《第10章 多线程》主要涵盖了关于并发、并行、进程和线程的基础概念,以及如何在Java中创建和管理线程。以下是详细的知识点解析: 1. **并发与并行**: - **并发**:指的是在一段时间内,多个事件看似同时发生,但...

    C实现循环缓冲区,线程交替执行,进行数据读取

    循环缓冲区(Circular Buffer)是一种在内存中实现的数据结构,常用于多线程环境下的数据共享,特别是当数据需要在不同线程之间高效地读写时。它利用数组或链表的形式,通过设定一个固定的存储区域,使得数据的读取...

    简单的多线程同步实例

    在编程领域,多线程是实现并发执行任务的重要机制,特别是在多核处理器系统中,它能有效利用系统资源,提高程序的执行效率。本实例主要关注如何在Java中实现简单的多线程同步,以模拟一个售票系统的操作。在这个系统...

    线程和线程锁的使用源码例子

    线程锁,又称为同步机制,是为了在多线程环境下保证数据的一致性和完整性而引入的,避免了多个线程同时访问共享资源可能导致的数据不一致问题。下面我们将深入探讨线程和线程锁的概念以及它们在实际应用中的使用。 ...

    面向Java多线程机制的软件重构方法.pdf

    Java多线程机制是Java编程中的核心特性,它允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。本文将深入探讨Java多线程的原理、设计模式以及重构方法,旨在帮助开发者更好地理解和优化多线程环境下...

    Python进程vs线程共18页.pdf.zip

    这意味着Python的多线程并不能实现真正的并行计算,但在IO密集型任务中,线程可以交替执行,从而提高效率。 4. **进程与线程的选择**: - **进程**:当需要进行大量计算且不依赖共享数据时,使用进程更为合适,...

    JAVA-multithreaded-programming.rar_Java @multithreaded_java prog

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程通过实现Runnable接口或继承Thread类来创建。下面我们将深入探讨Java多线程编程的核心...

    Java并发编程面试题合集

    线程安全是指当多个线程访问某个类时,无论运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要额外的同步措施,这个类都能表现出正确的行为。 volatile关键字用于声明变量,确保变量对...

    并发编程常见问题总结(持续更新...).pdf

    - 死锁:是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象。 - 避免死锁:可以通过资源分配有序、避免循环等待、限制锁的持有时间等策略来避免死锁。 - 活锁:与死锁类似,不过处于活锁...

    面试必问并发编程高级面试专题.zip

    并发编程是计算机科学中的一个重要领域,特别是在Java等多线程编程语言中,它涉及到如何在多个执行线程之间共享资源和协调任务。本面试专题主要针对高级并发编程的知识点进行探讨,旨在帮助求职者在面试中展现出深厚...

    JAVA并发编程实践

    - **并发(Concurrency)**:是指在一段时间内,程序中的多个线程交替执行,给人一种同时执行的感觉。 - **并行(Parallelism)**:是指同一时刻有多个处理器分别执行不同的任务。 在Java并发编程中,我们通常关注的是...

    计算机软件及应用移动通信软件编程基础—JAVA语言PPT学习教案.pptx

    线程是程序执行的最小单元,它允许在一个进程中并发执行多个任务。Java中,线程有两种实现方式:继承Thread类和实现Runnable接口。主线程由`main`方法所在的线程代表,可以通过`Thread.currentThread()`获取。启动...

    Java并发编程最全面试题 123道

    在执行到一定时间后,CPU会暂停这个线程的工作,保存其当前状态,然后切换到另一个线程并恢复该线程的状态,这个过程就叫做上下文切换。上下文切换是多线程环境下操作系统调度线程的一种基本操作,它涉及到保存和...

    后端开发基础知识整理JAVA、JVM、操作系统、网络、设计模式、mysql、redis、多线程、spring、springboo

    本篇文档对后端开发中的关键知识点进行了全面而深入的梳理,涵盖了Java语言基础、JVM、操作系统、网络技术、数据库、缓存、多线程、Spring框架等方面的核心概念和技术要点。以下是针对文档标题、描述以及部分内容中...

    并发编程面试题(2020最新版)

    线程死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种僵局。形成死锁的四个必要条件包括互斥条件、持有并等待条件、不可剥夺条件和循环等待条件。为了防止死锁,可以采用资源一次性分配、持有并等待条件...

    java并发编程的艺术

    - 并发与并行的区别:并发是指多个任务交替执行,而并行则是指多个任务在同一时刻执行。 - Java中的线程:Java通过`Thread`类提供了线程支持,开发者可以通过创建`Thread`实例或实现`Runnable`接口来创建线程。 -...

    An Introduction to Programming with C# Threads

    通过将程序分解成多个独立的任务,每个任务可以在不同的处理器上运行,或者在同一个处理器的不同时间片内交替执行,这样可以显著提高程序的整体执行效率。 #### 三、线程设施的设计 线程设施的设计是实现并发的...

Global site tag (gtag.js) - Google Analytics