[英]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.