我正在尝试用两个线程编写一个多线程程序;第一个将在提示“new”命令后更新随机访问文件,第二个接受命令“new”或“end”,并将其发送到第一个线程。我想使用由信号量控制的队列,这是我在下面写的。我只是不知道如何关联其他线程。一个线程应该从用户命令生成字符串并插入到队列中,另一个线程从队列中检索字符串以将它们写入直接访问文件。任何人都可以帮助编写如何启动线程吗?
package multi_threaded_producer_consumer;
import java.util.concurrent.Semaphore;
public class MTQueue {
private Semaphore sem = new Semaphore(1);
private java.util.Queue<String> statQ;
public static void main(String[] args) {
}
public MTQueue(){
statQ = new java.util.LinkedList<String>();
}
public void MTPut(String qe) {
try {
sem.acquire();
statQ.offer(qe);
} catch(InterruptedException ex) {
} finally {
sem.release();
}
}
public String MTGet() {
String retVal = new String();
try {
sem.acquire();
retVal = statQ.poll();
} catch(InterruptedException ex) {
} finally {
sem.release();
}
return retVal;
}
}
答案 0 :(得分:0)
任何人都可以帮助编写如何启动线程吗?
不确定。使用基本线程,您必须为要运行的线程创建一个Runnable
类。这是一个good tutorial on the subject。
以下是制作人代码的示例:
// queue must be final for the Runnable classes to use it
final MTQUeue queue = new MTQueue();
...
// create a new producer thread and start it
new Thread(new Runnable() {
public void run() {
queue.MTPut("new");
queue.MTPut("end");
}
}).start();
...
// create a new consumer thread and start it
new Thread(new Runnable() {
public void run() {
System.out.println("Got command: " + queue.MTGet());
System.out.println("Got command: " + queue.MTGet());
}
}).start();
关于您的代码的其他一些评论无序:
LinkedBlockingQueue
。MTPut()
和MTGet()
方法应该只是put()
和get()
。 MT是班级名称。statQ.offer(...)
应该是statQ.add(...)
。 offer()
方法仅适用于受限的队列。 LinkedQueue
不是其中之一。String retVal = new String();
new String()
不需要,可以删除。你真的可以做return statQ.poll();
而没有retVal
。捕获InterruptedException ex
并忽略它是非常糟糕的做法。当你抓住它时,你应该总是至少中断当前线程:
} catch(InterruptedException ex) {
// always a good pattern to re-interrupt the current thread
Thread.currentThread().interrupt();
// since the thread was interrupted we should return or something
return;