Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
2.9 kB
5
Indexable
Never
import java.util.ArrayList;

public class CheckThread implements Runnable {
    private int x;
    private ArrayList<CheckThread> arrayList;
    private Monitor monitor;
    private int index;


    public CheckThread(int x, Monitor monitor, ArrayList<CheckThread> arrayList,int index) {
        this.x = x;
        this.monitor = monitor;
        this.arrayList = arrayList;
        this.index = index;
    }


    public int getX()
    {
        return x;
    }



    @Override
    public void run() {
        for( int i=0 ; i<monitor.getChecks(); i++) {
            try {
                System.out.println(("check " + i + "INDEX" + index));
                int result = checkNeighbours();
                monitor.setBool(index);
                isDone(result,index);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }


        }


    }
    public synchronized void isDone(int res, int index) throws InterruptedException {
        System.out.println("ISDONE?");
        if (monitor.isFinished()) {
            System.out.println(arrayList);
            monitor.setBooleansFalse();
            System.out.println("Before Notify of Index " + index);
            notifyAll();
            System.out.println("After Notif of index " + index);
        }
        else {
            System.out.println("Wait of Thread " + index);
            wait();
        }
        System.out.println("Increase Decrease INDEX " + index);
        this.x+= res;

    }

    public synchronized int checkNeighbours() {
       int [] indexes = setNeighbours(index);
       int pre = indexes[0];
       int next = indexes[1];
       if(isSmall(index,pre,next))
           return 1;
       if (isBig(index,pre,next))
           return -1;
       return 0;

    }

    @Override
    public String toString() {
        return  Integer.toString(x);
    }

    public boolean isBig(int index, int pre, int next)
    {
        return arrayList.get(index).getX() > arrayList.get(pre).getX() && arrayList.get(index).getX() > arrayList.get(next).getX();
    }

    public boolean isSmall(int index, int pre, int next)
    {
        return arrayList.get(index).getX() < arrayList.get(pre).getX() && arrayList.get(index).getX() < arrayList.get(next).getX();
    }

    public int [] setNeighbours(int index)
    {
        int [] returnVal = new int[2];
        if ( index ==0 )
        {
           returnVal[0] = arrayList.size() -1;
           returnVal[1] = index +1;
        }
        else if(index == arrayList.size() -1)
        {
            returnVal[0] = index -1;
            returnVal[1] = 0;
        }
        else
        {
            returnVal[0] = index -1;
            returnVal[1] = index +1;
        }
        return returnVal;

    }
}