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

代码都已上传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();
            }


        }
    }

你可能感兴趣的:(多线程学习:多线程习题(四))