繁体   English   中英

如何使用 java 中的 2 个线程在文件中打印数据

[英]How can i print data in a file using 2 threads in java

我需要使用 2 个运行替代的线程在文件中打印一些数据,一个用于奇数索引,另一个用于偶数索引。 我拥有的数据存储在这个数组中,cursuri = new ArrayList(),它是从创建的

    String nume;
    String descriere;
    Profesor profu;
    Set <Student> studenti;
    int[] note;

我需要的数据保存在 studenti 中,这是我到目前为止所尝试的:

public String[] studentiEven(ArrayList<Curs> c)
    {
        synchronized (this) 
        {
            for(int i=0;i<c.size();i++)
            {
                String[] x= new String[3];
                int nr=0;
                for(Student s:c.get(i).studenti)
                {
                    while(nr%2==1)
                    {
                        try {
                            wait();
                        }catch(InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    nr++;
                    notify();
                    x[0]=s.nume;
                    x[1]=s.prenume;
                    x[2]=s.grupa;
                    return x;
                
                }
                
            }
            String[] y=new String[3];
            return y;
        }
    }
    
    public String[] studentiOdd(ArrayList<Curs> c)
    {
        synchronized (this) 
        {
            for(int i=0;i<c.size();i++)
            {
                String[] x= new String[3];
                int nr=0;
                for(Student s:c.get(i).studenti)
                {
                    while(nr%2==0)
                    {
                        try {
                            wait();
                        }catch(InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    nr++;
                    notify();
                    x[0]=s.nume;
                    x[1]=s.prenume;
                    x[2]=s.grupa;
                    return x;
                
                }
            }
            String[] y=new String[3];
            return y;
        }
    }

那些是2个功能,主要是我试图写:

 try {
        FileWriter myWriter = new FileWriter("studenti555.txt");
            
        final String[] a = new String[3];
            Thread t1=new Thread(new Runnable() {
                  public void run()
                  {
                        a[0]=c.studentiEven(c.cursuri)[0];
                        a[1]=c.studentiEven(c.cursuri)[1];
                        a[2]=c.studentiEven(c.cursuri)[2];  
                        try {
                            myWriter.write(a[0]);
                            myWriter.write(',');
                            myWriter.write(a[1]);
                            myWriter.write(' ');
                            myWriter.write(a[2]);
                            myWriter.write('\n');
                            
                            
                        }catch(Exception e)
                        {
                            System.out.println("eroare");
                        }
                  }
                  
                  
              }
                      );
            Thread t2=new Thread(new Runnable() {
                  public void run()
                  {
                        a[0]=c.studentiOdd(c.cursuri)[0];
                        a[1]=c.studentiOdd(c.cursuri)[1];
                        a[2]=c.studentiOdd(c.cursuri)[2];   
                        try {
                            myWriter.write(a[0]);
                            myWriter.write(',');
                            myWriter.write(a[1]);
                            myWriter.write(' ');
                            myWriter.write(a[2]);
                            myWriter.write('\n');
                            
                            
                        }catch(Exception e)
                        {
                            System.out.println("eroare");
                        }
                  }
                  
                  
              }
            
                      );
              t1.start();
              t2.start();   
         myWriter.close();
        }catch(Exception e)  
        {  
            e.printStackTrace();  
            System.out.print("teapa frate \n"); 
        }

我试图调试它,但它没有通过捕获异常或任何东西 go ,你们能帮帮我吗?

 t1.start();
 t2.start();   
 myWriter.close();

您在 t1 和 t2 运行时关闭 myWriter 尝试使用

 t1.start();
 t2.start();  
 t1.join();
 t2.join(); 
 myWriter.close();

另一个问题是 function studentiEven 和 studentiOdd 都调用了 wait();。 这会停止执行,直到某个其他线程调用 notify() 但没有线程调用 notify();

还要注意 final String[] a = new String[3]; 在 t1 和 t2 之间共享,这不是线程安全的。

您可以使用信号量来完成此任务

通过将奇数信号量和偶数信号量分别设置为 1 和 0,在开始时两个线程都尝试获取信号量时,只有奇数信号量让线程通过,因为它被初始化为 1。这样可以保证奇数线程在偶数线程之前运行.

        FileWriter fileWriter = new FileWriter("./text.txt");
        Semaphore oddSem = new Semaphore(1);
        Semaphore evenSem = new Semaphore(0);
        List<Object> list = new ArrayList<>();

对于奇数线程,在第一行尝试获取oddSem,并在从列表中获取一个项目后释放evenSem。 这样,即使线程现在也可以继续。

        Runnable oddWriter = () -> {
            Object object;
            do {
                acquire(oddSem);
                if (list.isEmpty()) {
                    evenSem.release();
                    break;
                }
                object = list.remove(0);
                evenSem.release();
                String value = String.format("%s %s\n" , "Odd Thread:",object.toString());
                writeToFile(fileWriter, value);
            } while (true);
        };

对于偶数线程做相反的事情

        Runnable evenWriter = () -> {
            Object object;
            do {
                acquire(evenSem);
                if (list.isEmpty()) {
                    oddSem.release();
                    break;
                }
                object = list.remove(0);
                oddSem.release();
                String value = String.format("%s %s\n" , "Even Thread:",object.toString());
                writeToFile(fileWriter, value);
            } while (true);
        };

最后,启动线程

        Thread oddThread = new Thread(oddWriter);
        Thread evenThread = new Thread(evenWriter);

        oddThread.start();
        evenThread.start();

        try {
            oddThread.join();
            evenThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        fileWriter.close();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM