我想创建有两个线程的应用程序 一个线程读取char数据 另一个线程将其打印到控制台 我有以下代码到interThreadCommunication (假设文件的数据类似于s t a c k o v e r l l w) 我正在产生如下输出:
From echo int 115 char value s
From echo int 116 char value t
From echo int 97 char value a
From echo int 99 char value c
From echo int 107 char value k
From echo int 111 char value o
From echo int 118 char value v
From echo int 101 char value e
From echo int 114 char value r
From echo int 102 char value f
From echo int 108 char value l
From echo int 111 char value o
From echo int 119 char value w
From echo int 10 char value
代码:
import java.io.*;
class store
{
int i;
public int get()
{
return i;
}
public void set(int i)
{
this.i=i;
}
}
public class Main
{
public static void main(String a[])
{
store s=new store();
Thread th=new Thread(new read(s));
Thread pr=new Thread(new echo(s));
th.start();
pr.start();
}
}
class echo implements Runnable
{
store st;
public echo(store s)
{
st=s;
}
public void run()
{
while(true)
{
int t=st.get();
if(t==-1)
break;
if(t!=32)
{
System.out.println("From echo int "+t+" char value "+(char)st.get());
}
st.set(0);
try
{
//Thread.sleep(200);
while(true)
{
this.wait();
if(st.get()!=0)
break;
}
}
catch(Exception r)
{
}
}
}
}
class read implements Runnable
{
FileReader fr=null;
int r;
store st;
public read(store s)
{
st=s;
}
public void run()
{
try
{
fr=new FileReader("data.txt");
while(true)
{
int r=fr.read();
st.set(r);
while(st.get()==0)
{
this.wait();
}
if(r==-1)
break;
try
{
Thread.sleep(200);
}
catch(Exception re)
{
}
}
st.set(-1);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{
fr.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
如果我从类sleep()
中移除read & echo
方法,那么我就会
From echo int 0 char value
From echo int 0 char value
From echo int 0 char value
.
.
.
我正在使用wait()
方法来处理另一个线程。
我正在以正确的方式进行,或者 interThreadCommunication
答案 0 :(得分:5)
您应该考虑使用生产者 - 消费者模式:
线程A将读取文件中的条目,并将它们放入队列中。
线程B将从队列中读取条目并将其打印出来。
您可以使用blocking queue implementation来确保队列的线程安全。
我也会考虑不将一个字符放入队列,但可能是一组字符(一个单词或一行),
为了减少入队和出队的数量(因为这些方法是线程安全的,它们比非同步方法具有更高的性能损失)。
答案 1 :(得分:1)
- 您可以在读取线程(即join()
)上使用readThread.join()
方法,以便第一个读取线程在写入线程开始将其写入控制台之前完全读取文件。
<强>例如强>
readThread.start();
try{
readThread.join()
}catch(Excpection ex){}
writeThread.start();
- 您还可以使用java.util.concurrent.CountDownLatch
来处理此问题。
- 我认为来自并发包的SingleThreadExecutor
也会为你做的工作。
///////////////////////////编辑部分/////////////// /// 强>
- 如果您希望它们同时工作,请使用wait/notify
组合中的await/signal
组合或concurrent
组合。
- ArrayBlockingQueue
也可以帮助您从concurrent
库中实现此目的。