我在为多线程程序创建第二个线程时遇到了麻烦

时间:2016-07-27 15:36:19

标签: java multithreading queue semaphore

我正在尝试用两个线程编写一个多线程程序;第一个将在提示“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;
    }   

}

1 个答案:

答案 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;