美文网首页
多线程学习:多线程习题(四)

多线程学习:多线程习题(四)

作者: 蓝汝丶琪 | 来源:发表于2018-01-16 14:02 被阅读29次

    代码都已上传github

    P04 有四个线程1、2、3、4。线程1的功能就是输出A,线程2的功能就是输出B,以此类推

    现在有四个文件file1,file2,file3, file4。初始都为空。
    现要让四个文件呈如下格式:
    file1:A B C D A B....
    file2:B C D A B C....
    file3:C D A B C D....
    file4:D A B C D A....

    心得

    • 虽然是4个线程,但是还是不能做到对4个文件同时进行读写。感觉以后可以继续优化
    • 在对同步局域用Lock 上锁的时候会出现java.lang.IllegalMonitorStateException 的问题,网上查了一下。有一个说法是

    在对某个对象上调用wait()方法进行线程等待(让其他竞争执行该代码的线程上锁)时,没有对该对象执行同步操作。
    所以解决方法是:

    synchronized (xxxx)  {
         xxxx.wait();
       }
    

    代码

    核心代码

      //确定第几个线程可以输出
        //如果换了输出文本,那么就要限制第一个输出的线程
        public static void changeThread(){
            if (count % 8 == 0) {
                ThreadNumber =FileNumber +2;
                if(ThreadNumber>=4){
                    ThreadNumber = 4;
                }
            }
        }
    
        //变更输出文本 当一个文本写入8个的时候就进行切换文本
        public static void changeFile() {
            if(count %8 ==0){
                FileNumber++;
                if(FileNumber>=4){
                    FileNumber = 3;
                }
            }
    
        }
    
        public static void out(char a) {
    
            synchronized (lock) {
    
                Integer integer = Integer.valueOf(Thread.currentThread().getName());
    
                while (integer != ThreadNumber) {
                    try {
    
                        lock.wait();
    
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
    
                changeFile();
                try {
                    FileWriter fileWriter = new FileWriter(files[FileNumber], true);
                    System.out.println("将要写入字符 " + a);
                    fileWriter.write(a);
                    fileWriter.flush();
                    fileWriter.close();
                    count++;
                    //改变线程
                    if (integer % 4 == 0) {
                        ThreadNumber = 1;
                    } else {
                        ThreadNumber++;
                    }
                    changeThread();
                    lock.notifyAll();
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
    
            }
        }
    

    相关文章

      网友评论

          本文标题:多线程学习:多线程习题(四)

          本文链接:https://www.haomeiwen.com/subject/hmysoxtx.html