`

java 多线程读写文件,wait,notify

    博客分类:
  • java
阅读更多

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileUtil {

    FileInputStream fis;
    byte[] buf=new byte[1024];
    FileOutputStream fos;
    int len=0;
    public static void main(String[] args) {

        FileUtil fu=new FileUtil();
//        String srcFile="F:/test.properties";
//        String desFile="F:/test.txt";
    //    String srcFile="F:/B-初步.ppt"; //java.io.FileNotFoundException,为啥 不支持ppt呢?
//        String srcFile="F:/部署文档.doc";  //中文 可以访问,word 版本要一致,不然文件打不开
//        String srcFile="F:/t.doc";
        String srcFile="F:/t.ppt";  //支持ppt,但是打不开文件
        String desFile="F:/test.ppt";
        fu.init(srcFile, desFile);
       
        fu.new ReadFileThread().start();
        fu.new WriteFileThread().start();
    }
   
    /**
     * 初始化,输入流,输出流
     * @param srcFile 读取的文件名
     * @param desFile 写入的文件名
     */
    void init(String srcFile,String desFile){
        try {
            fis=new FileInputStream(srcFile);
            fos=new FileOutputStream(desFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
   
    }
   
    /**
     * 读取一个文件到buf数组中,先读一次,再wait()
     * @author Administrator
     *
     */
    class ReadFileThread extends Thread{
        public void run(){
            try{
 
                synchronized(this){

                    if(len!=0){
                        try {
                            wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    len=fis.read(buf);
                    notify();                          //唤醒写入线程
                }
            }
            catch(IOException e){
                e.printStackTrace();
            }
            finally{
               
            }
        }
    }

    /**
     * 写入另一个文件,如果读取的长度len!=0,就把buf的内容写入到另一个文件,并且把len=0;换醒读取线程
     * @author Administrator
     *
     */
    class WriteFileThread extends Thread{
        public void run() {
            synchronized(this){
                if(len==0){
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                try {
                    fos.write(buf,0,len);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                len=0;
                notify();
            }
        }
    }
}

 

注意:java.lang.IllegalMonitorStateException: current thread not owner?

对于上述方法,只有在当前线程中才能使用,否则报运行时错误java.lang.IllegalMonitorStateException: current thread not owner.

从实现角度来分析:
在线程调用wait()方法时,需要把它放到一个同步段里,即应该在调用前使用
1synchroed(this){
2  thread.wait();
3  
4}
5
否则将会出现"java.lang.IllegalMonitorStateException: current thread not owner"的异常。

分享到:
评论

相关推荐

    java多线程文件传输

    Java多线程文件传输是Java编程中一个重要的实践领域,特别是在大数据处理、网络通信和分布式系统中。在Java中,多线程可以提高程序的执行效率,尤其在处理并发任务时,如大文件的上传、下载和传输。下面将详细探讨...

    Java多线程同步(wait()notify()notifyAll())[文].pdf

    本文将深入探讨Java中的wait()、notify()和notifyAll()方法,以及synchronized关键字和原子操作在多线程环境中的应用。 1. **wait()方法**: - wait()是Object类的一个方法,它的作用是让当前线程暂停执行并释放它...

    Java多线程文件下载

    Java多线程文件下载是一种高效的下载策略,它通过将大文件分割成多个部分,然后创建多个线程分别下载这些部分,来实现并行下载。这种技术可以显著提高下载速度,尤其是在网络条件不稳定或者带宽有限的情况下。下面...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    java多线程Demo

    在多线程环境下,可能会出现数据竞争问题,为了解决这个问题,Java提供了多种同步机制,如synchronized关键字、wait/notify机制、Lock锁(ReentrantLock)等。synchronized用于控制对共享资源的访问,而wait/notify...

    java多线程进度条

    为了在多线程中同步进度更新,我们可以利用synchronized关键字、wait()、notify()方法,或者使用Java并发库中的高级工具,如Semaphore、CyclicBarrier或CountDownLatch等。 一个简单的进度条实现可以采用共享变量...

    JAVAJAVA多线程教学演示系统论文

    《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...

    Java的sychronized、wait和notify范例

    `synchronized`关键字、`wait()`和`notify()`方法是Java多线程中用于控制并发访问共享资源的重要工具,它们是Java内存模型(JMM)的一部分,主要用于解决线程间的同步问题。 一、`synchronized`关键字 `...

    java多线程下载文件

    在Java编程中,多线程下载文件是一种优化大文件下载效率的方法。传统的单线程下载方式,由于网络I/O的限制,可能导致下载速度较慢,而多线程下载则可以利用计算机的多核处理器资源,将文件分成多个部分并行下载,...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    Java多线程设计模式是Java开发中的核心概念,它涉及到如何高效、安全地在多个执行线程之间共享资源和协调任务。设计模式是解决特定问题的成熟方案,它们是编程经验的结晶,可以帮助开发者在面临多线程挑战时快速找到...

    java多线程编程

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

    深入学习:Java多线程编程

    2. **线程同步**:Java提供了多种线程同步机制,如synchronized关键字、wait/notify机制、Lock接口(ReentrantLock、读写锁等)和Semaphore信号量。这些机制用于避免并发问题,如数据竞争、死锁和活锁等。 3. **...

    Java多线程程序设计

    Java多线程程序设计是Java开发中的重要领域,它允许应用程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。在Java中,多线程主要通过两种方式实现:继承Thread类和实现Runnable接口。 一、创建线程...

    JAVA 多线程的PPT和示例

    Java多线程是Java编程中的一个核心概念,它允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。在Java中,多线程主要通过两种方式实现:继承Thread类和实现Runnable接口。这份"JAVA多线程的PPT和示例...

    Java多线程设计模式上传文件

    3. **线程同步**:为了解决多线程环境下的数据安全问题,Java提供了多种同步机制,如synchronized关键字、wait()和notify()方法、Lock接口(如ReentrantLock可重入锁)以及Semaphore信号量等。 4. **线程池**:Java...

    Java多线程编程模板

    在Java编程中,多线程是程序设计中的一个重要概念,特别是在服务器端应用和高并发场景下,多线程能够充分利用CPU资源,提高程序的执行效率。本知识点将深入探讨Java多线程编程模板,帮助开发者理解和掌握如何在Java...

    Java多线程编程总结

    ### Java多线程编程总结 #### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个...

    java实验(包含文件、多线程等)

    这个"java实验"的压缩包显然提供了学习和实践Java基础及高级特性的资源,特别是关于文件操作、多线程以及图形用户界面(GUI)和网络编程。 1. **文件操作**: 在Java中,我们可以使用`java.io`包来处理文件和流。...

Global site tag (gtag.js) - Google Analytics