【发布时间】:2018-05-06 08:04:09
【问题描述】:
我必须创建一个对冲模拟器。有例如。它有10个段,每个段都应该有自己的专用线程模拟段的增长(每次我们要计算段是否长大时,我们都应该进行随机测试)。 此外,还应该有一个额外的园丁线程。 因此,Garder 应该在其大小达到 10 时削减部分(然后他将其大小削减回初始级别 1 并在他的笔记中添加通知)。
我的尝试是这样的:
public class Segment implements Runnable {
private int currentSize;
@Override
public void run() {
if(Math.random() < 0.3)
incrementSize();
}
private synchronized void incrementSize() {
currentSize++;
}
public synchronized int getCurrentSize() {
return currentSize;
}
public synchronized void setCurrentSize(int newSize) {
currentSize = newSize;
}
}
public class Gardener implements Runnable {
private int[] segmentsCutAmount = new int[10]; //Gardener notes
private Collection<Segment> segments;
public Gardener(Collection<Segment> segmentsToLookAfter) {
segments = segmentsToLookAfter;
}
@Override
public void run() {
while(true) {
//Have no idea how to deal with 10 different segments here
}
}
}
public class Main {
private Collection<Segment> segments = new ArrayList<>():
public void main(String[] args) {
Main program = new Main();
for(int i = 0; i < 10; i++)
program.addSegment();
Thread gardenerThread = new Thread(new Gardener(program.segments));
}
private void addSegment(Collection<Segment> segments) {
Segment segment = new Segment();
Thread segmentThread = new Thread(segment);
segmentThread.start();
segments.add(segment);
}
}
当分段达到最大高度时,我不确定我应该做什么。 如果有 10 个园丁,每个人都可以观察一个片段,但不幸的是,园丁是一个孤独的射手——他没有家人,他的朋友很忙,不愿意帮助他。你愿意帮助我吗? :D 我一般都知道同步的基础知识——同步方法/块、锁、等待和通知方法,但这次我完全不知道该怎么做:( 它就像可怕的僵局!当然,我不希望被勺子喂食。任何类型的提示也会非常有帮助。提前感谢您,祝您有美好的一天!
【问题讨论】:
-
您可以创建一个
BlockingQueue,其中树篱一旦长到 8 高以上就会自行插入,园丁从中接受工作订单。但是您必须添加代码才能获得更好的答案。 -
欢迎来到 SO。 “我的尝试是这样的”你能发minimal reproducible example 来演示吗?
-
你好大牛,谢谢你的回答。即使我将段添加到队列中,园丁是否仍然无法观察到当时只有一个的增长?我将非常感谢代码澄清。谢谢!我试图尽可能简单地提出我的问题。我没有附加任何代码,因为我只有随机测试工作,我不知道如何解决剩下的任务。我当时需要更一般的帮助。
-
不,假设高度为 8 的任何段线程将放入阻塞队列“园丁的东西”,当队列中有元素时,园丁将解除阻塞并读取排队并处理/切割段,当队列为空时,园丁将再次阻塞并等待段增长
-
对于“更一般的帮助”,此站点不正确。也许softwareengineering.stackexchange.com 会更合适。
标签: java multithreading runnable synchronization