【发布时间】:2023-04-01 13:42:01
【问题描述】:
我创建了两个线程并修改了 run 函数,以便一个线程读取一行,另一个线程将同一行写入新文件。这种情况会一直发生,直到整个文件被复制。我遇到的问题是,即使我使用变量来控制线程一个一个地执行,但线程仍然执行不均匀,即一个线程执行多次,然后控制权转移。我附上了代码的任何解决方案。我是 java 新手,因为它只用于类分配,所以代码可能不是最优化的。
public class thread1 extends Thread {
//To create producer and consumer as threads
//Shared variable
public static int x = 0;//checks if all lines are read
public static String line; /holds lines from file
public static int j = 0;//variable to switch between threads based upon its value
public thread1(String threadName) { //Constuctor
super(threadName); //Call to constructor of Thread class
}
public void run() {
while (x != -1)
{
if (Thread.currentThread().getName().contains("Reader")) {
if (x != -1&&j==0)
{
j=1;
String fileName = "d:/salfar.txt";
try {
// FileReader reads text files in the default encoding.
FileReader fileReader =
new FileReader(fileName);
// Always wrap FileReader in BufferedReader.
BufferedReader bufferedReader =
new BufferedReader(fileReader);
for (int check = 0; check <= x; check++) {
line = bufferedReader.readLine();
}
if (line == null) {
x = -1;
} else {
System.out.println(line);
x++;
}
// Always close files.
bufferedReader.close();
} catch (FileNotFoundException ex) {
System.out.println(
"Unable to open file '"
+ fileName + "'");
} catch (IOException ex) {
System.out.println(
"Error reading file '"
+ fileName + "'");
// Or we could just do this:
// ex.printStackTrace();
}
}
yield();
}
else if (Thread.currentThread().getName().contains("writer")) {
if (x != -1 && line != null&&j==1)
{
j=0;
String fileName = "d:/salfar1.txt";
try {
// Assume default encoding.
FileWriter fileWriter =
new FileWriter(fileName, true);
// Always wrap FileWriter in BufferedWriter.
BufferedWriter bufferedWriter =
new BufferedWriter(fileWriter);
// Note that write() does not automatically
// append a newline character.
bufferedWriter.write(line);
bufferedWriter.newLine();
System.out.println("y");
// Always close files.
bufferedWriter.close();
} catch (IOException ex) {
System.out.println(
"Error writing to file '"
+ fileName + "'");
// Or we could just do this:
// ex.printStackTrace();
}
}
Thread.yield();
}
else{}
}
}
public static void main(String[] args) {
thread1 p = new thread1("Reader");
thread1 c = new thread1("writer");
p.start();
c.start();
}
}
Thanks
【问题讨论】:
-
因为不幸的是,这就是 Threads 所做的!!!
-
向我们展示您的相关代码。在一个线程中读取一行然后在另一个线程中写入它也是一个坏主意,因为这使得它本质上是连续的。相反,如果您要读入缓冲区,则可以让线程以更并行的方式工作。
-
发布你的代码 [到目前为止你做了什么]
-
你被困在
producer and consumer problem使用等待和通知逻辑来摆脱它并发布一些代码以获得帮助 -
我已附上代码。我是 java 新手,因为它只用于类分配,所以代码可能不是最优化的。
标签: java multithreading