首页 > 解决方案 > 多线程问题

问题描述

我需要初始化一个Arrayof 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.
}

标签: java

解决方案


推荐阅读