我正在尝试编写多线程代码。但严重的是我无法理解我从哪里开始。我的头也在敲打。请帮帮我。
我的任务是,
pending_tasks
,其中包含需要进行处理的任务。completed_tasks
,其中包含完成处理并准备交付的任务。我的实施思路,
pending_tasks
和completed_tasks
。pending_tasks
。pending_tasks
接受任务并开始处理,之后进入completed_tasks
。pending_tasks
,每当任何任务到来时,都要开始相同的处理。我的困惑,
我知道它可以是使用ArrayBlockingQueue和Mutex的代码。但我不明白我怎么能开始这个。我对互斥体有很好的理解,我从这个link读到了互斥体,并且在我阅读了很多关于这个网站的问题的同时也对blockingQueue有了很好的理解。
您能否给我一些实施指南,以便我可以编写这个多线程代码。
我已经为此编写了一些代码,但这并没有实现我的任务的最终目标。
提前致谢。寻找你的回复。
编辑没有。 1
请参阅下面的代码。此代码工作正常,但此代码缺少一个功能。请帮我补充一下,给出一些指导。
功能是,
请帮助我添加上述功能。我认为我们必须在生产者线程和消费者线程之间进行通信,并且线程通信是通过使用Mutex完成的(我认为)。请帮我实现相同的
我的代码,
MultiThread类
package multithread;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class MultiThread {
public static BlockingQueue<Integer> pending_task;
public static BlockingQueue<Integer> completed_task;
public MultiThread(int length) {
pending_task = new ArrayBlockingQueue<Integer>(length, true);
completed_task = new ArrayBlockingQueue<Integer>(length, true);
}
}
制作人类
package multithread;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Producer implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
System.out.println("PRODUCER: Try to put value " + i + " in the pending queue");
MultiThread.pending_task.put(i);
System.out.println("PRODUCER: Successfully put value " + i + " in the pending queue, now its turn to consumer");
} catch (InterruptedException ex) {
Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
消费者类
package multithread;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Consumer implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
System.out.println("CONSUMER: Try to take value from the pending queue");
int val = MultiThread.pending_task.take();
System.out.println("CONSUMER: Successfully take value, and that is " + val);
System.out.println("CONSUMER: Processing starts");
Thread.sleep(1000);
System.out.println("CONSUMER: Processing ends");
System.out.println("CONSUMER: Try to put that that value in completed queue, and the value is " + val);
MultiThread.completed_task.put(val);
System.out.println("CONSUMER: Successfully put into completed queue");
//Serve this value to the corresponding user
} catch (InterruptedException ex) {
Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
DeliveryBoy类
package multithread;
import java.util.logging.Level;
import java.util.logging.Logger;
public class DeliveryBoy implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
System.out.println("DELIVERYBOY: Waiting for the value near completed queue");
int val = MultiThread.completed_task.take();
System.out.println("DELIVERYBOY: Succesfully take value from completed queue and the vlue is " + val);
//Serve this value to the corresponding user
} catch (InterruptedException ex) {
Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
测试类
package multithread;
public class Test {
public static void main(String[] args) {
// TODO code application logic here
MultiThread ml = new MultiThread(1);
new Thread(new Producer()).start();
new Thread(new Consumer()).start();
new Thread(new DeliveryBoy()).start();
}
}
答案 0 :(得分:1)
public void put(E e) 抛出InterruptedException
将指定的元素插入此队列的尾部,等待 **如果队列已满,则空间可用
public E take() 抛出InterruptedException
从界面复制的描述:BlockingQueue检索并删除 这个队列的头部,必要时等待,直到一个元素成为 可用强>
所以你需要做的就是从你的线程中调用这些方法 试试这个(研究javadoc),当你遇到更具体的问题时,你可以再问一次。