编写程序,实现生产者和消费者问题。输入:由英文字母和数字组成的不定长度字符串数组,例如{“abc”,”23d”,”1a”}。每隔100毫秒,生产者线程读入数据,放入生产者公用的仓库;消费者从仓库中取出字符串,进行倒置,如上例{“cba”,”d32”,”a1”}; 输出:倒置后的字符串。
提示:可以定义4个类:生产者类、消费者类、产品类和测试类。
代码:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
ArrayList<String>t=new ArrayList<>();
int n=in.nextInt();
String s;
for(int i=0;i<n;i++){
s=in.next();
t.add(s);
}
warehouse ck=new warehouse(t);
new Thread(new Producer(ck)).start();
new Thread(new Consumer(ck)).start();
in.close();
}
}
class warehouse{
private ArrayList<String>all=new ArrayList<>();
private LinkedList<String>tmp=new LinkedList<>();
private boolean flag=true;
private int len=0;
public boolean getsta()
{
return flag;
}
public void cg()
{
flag=false;
}
public int getlen(){
return len;
}
public String getS(int i){
if(i<len) return all.get(i);
else return null;
}
public warehouse(ArrayList<String>tp){
all=tp;
len=all.size();
}
public synchronized void get(){
if(tmp.isEmpty()&&flag){
try{
wait();
}
catch(InterruptedException e){
e.printStackTrace();
}
}
//取出数据
StringBuffer tout=new StringBuffer(tmp.getFirst());
tout.reverse();
System.out.println(Thread.currentThread().getName()+":"+tout);
tmp.removeFirst();
notify();
}
public synchronized void put(String tp){
tmp.add(tp);
notify();
}
}
class Consumer implements Runnable{
public warehouse ware=null;
public Consumer(warehouse t){
ware=t;
}
public void run(){
while(true){
if(ware.getsta())
ware.get();
else break;
}
}
}
class Producer implements Runnable{
public warehouse ware=null;
public Producer(warehouse t){
ware=t;
}
public void run(){
int n=ware.getlen();
for(int i=0;i<n;i++){
ware.put(ware.getS(i));
if(i==n-1) ware.cg(); //生产者生产结束,flag置为false,避免消费者无限等待
try{
Thread.currentThread().sleep(100);
}
catch(InterruptedException e){
e.printStackTrace();
}
}
}
}