`

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并发编程原理与实战

    了解多线程所带来的安全风险.mp4 从线程的优先级看饥饿问题.mp4 从Java字节码的角度看线程安全性问题.mp4 synchronized保证线程安全的原理(理论层面).mp4 synchronized保证线程安全的原理(jvm层面).mp4 单例问题...

    这就是标题—— JUC.pdf

    多线程锁 并发下的集合类 List Set Map Callable接口 线程创建的方式 callable / runnable FutureTask JUC常用辅助类 CountDownLatch (减少计数器) CyclicBarrier(加法计数器) Semaphore(信号量,流量控制) ...

    java 面试题 总结

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    龙果java并发编程完整视频

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    龙果 java并发编程原理实战

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    BAT面试真题最新(涵盖全方面)

    线程通讯:线程之间通过 wait,notify 等⽅方式通讯。保证每次上下⽂文切换都是有意义的。减 少⽆无谓的线程切换。 java.nio.中提供了了 Selector:通过调⽤用Selector的select⽅方法可以从所有的Channel中找到...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段16讲、多线程读写锁分离设计模式讲解-上.mp4 │ 高并发编程第二阶段17讲、多线程读写锁分离设计模式讲解-中.mp4 │ 高并发编程第二阶段18讲、多线程读写锁分离设计模式讲解-下.mp4 │ 高...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段16讲、多线程读写锁分离设计模式讲解-上.mp4 │ 高并发编程第二阶段17讲、多线程读写锁分离设计模式讲解-中.mp4 │ 高并发编程第二阶段18讲、多线程读写锁分离设计模式讲解-下.mp4 │ 高...

    Java语言程序设计(一)真题及答案.doc

    A.sleep() B.notify() C.wait() D.join() 正确答案:B 您的答案: 本题解析: 暂无解析 2.以下标识符中,不是Java语言关键字的是()。 A.wait B.new C.long D.switch 正确答案:A 您的答案: 本题解析: 暂无解析 3....

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    Java 并发编程原理与实战视频

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    jstack生成的Thread Dump日志.docx

    临界区的设置是为了保证其内部的代码执行的原子性和完整性,但因为临界区在任何时间只允许线程串行通过,这和我们使用多线程的初衷是相反的。如果在多线程程序中大量使用synchronized,或者不适当的使用它,会造成...

    java并发编程

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    Java学习题答案

    连最基本的资源释放都做不好,还谈什么多线程编程. 6.EJB规范规定EJB中禁止的操作有哪些?(15分) 共有8点,答出下列3-4点得满分. 1.不能操作线程和线程API(线程API指非线程对象的方法如notify,wait等) 2....

    JAVA程序设计教程

    Java程序.............................................................................................6 1.3.1 Java程序的结构 ...........................................................................

    java核心知识点整理.pdf

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    UNIX网络编程 卷2:进程间通信

     16.2 多线程化 330  16.3 服务器捆绑 333  16.4 认证 336  16.5 超时和重传 338  16.6 调用语义 342  16.7 客户或服务器的过早终止 343  16.8 XDR:外部数据表示 345  16.9 RPC分组格式 361  16.10 小结 ...

Global site tag (gtag.js) - Google Analytics