java - 多线程问题
问题描述
我需要初始化一个Array
of n
Threads
。每个代表一个在创建Thread
过程中随机初始化的数字。Thread's Object
程序应该运行m
迭代。在每次迭代中,Threads
数字都需要更新。如果 中的左右邻居Array
都大于此值,Thread
则该Thread's
值将在下一次迭代中获得 +1。如果两个邻居值都低于该Thread's
值,则该Thread's
值将变为-1。否则,Thread's
值不会改变。
代码从 GUI 类中的代码行开始。该行是:
Controller cont = new Controller(n,m)
代码只在 Controller 类中输入更新的方法一次,然后所有的Threads
都将进入休眠状态而不实现更新的方法。
这是为什么?
这是我的代码:
public class Threads extends Thread
{
private int num;
private Controller cont;
private int toUpdate;
private int index;
public Threads(Controller c, int i)
{
num = (int)(Math.random() * 100 + 1); // random number between 1-100
cont = c;
index = i;
}
public void run()
{
for(int j = 1; j <= cont.getIterations(); j++)
{
toUpdate = cont.checkValue(this, this.getIndex());
cont.finished();
cont.threadWait();
num += toUpdate;
cont.updated();
cont.threadWait();
}
}
public int getValue()
{
return this.num;
}
public int getIndex()
{
return this.index;
}
}
public class Controller
{
private Threads[] threadsArray;
private int iterations;
private boolean finished = false;
private static int numOfThreads;
public Controller(int n, int m)
{
threadsArray = new Threads[n];
for(int i=0; i < threadsArray.length; i++)
threadsArray[i] = new Threads(this, i);
iterations = m;
numOfThreads = n;
printResults();
for(int i=0; i < threadsArray.length; i++)
threadsArray[i].start();
}
public synchronized void threadWait()
{
while(!finished)
{
try{ wait(); }
catch(InterruptedException e) {}
}
numOfThreads++;
waitForAll();
if(numOfThreads == threadsArray.length)
{
finished = false;
notifyAll();
}
}
public int checkValue(Threads t, int ind) //returns the thread's value to be updated. 1,-1 or 0.
public int getIterations()
{
return this.iterations;
}
public synchronized void finished()
{
numOfThreads--;
notifyAll();
if(numOfThreads == 0)
finished = true;
}
public void iteration()
{
for(int i=0; i < threadsArray.length; i++)
threadsArray[i].start();
}
public synchronized void updated()
{
numOfThreads--;
if(numOfThreads == 0)
{
printResults();
finished = true;
notifyAll();
}
}
public synchronized void waitForAll()
{
while(numOfThreads != threadsArray.length)
{
try{ wait(); }
catch(InterruptedException e) {}
}
}
public void printResults() // prints the result on each iteration.
}
解决方案
推荐阅读
- selenium - 通过选项 add_argument 使用 Selenium 更改 Firefox 的用户代理?
- python - 如何删除初始迁移依赖的库?
- django - Django如何在表单的错误消息中更改自定义用户模型的名称
- python - 如何使用包含标题的 CSV 文件运行 Matplotlib
- java - 不满足的依赖异常(Springboot)
- android - 如何将主要活动 FAB 禁用到另一个片段中?
- c# - UWP 中的反应式 UI 用户控件
- haskell - Haskell:多个字符串之间的所有组合
- javascript - 如何在 Material-UI 对话框模式中使用 react-infinite-scroll-component?
- jupyter-notebook - 双击.ipynb文件时如何打开Jupyter实验室