Search code examples
javamultithreadingfor-loopnested-loops

Nesting loops (Threads) in JAVA


As my title states, i need to nest for loops (i am not sure if nesting is the right word i am looking for, but i need one for loop, inside the other)

The current code i have is

public class Main {
    private static String[] passwords = {"zero", "one", "two", "three", "four"};
    public static void main(String[] args) {
        int threadds = 10;
        Thread[] threads = new Thread[threadds];
        for (int j = 0; j < passwords.length; j++) {
            for (int i = 0; i < passwords.length; i++) {
                ClaimSnipe NS = new ClaimSnipe();
                NS.password = String.valueOf(i);
                NS.i = i;
                NS.DropTome = System.currentTimeMillis() + 1000;
                Thread t = new Thread(NS);
                threads[i] = t;
                threads[i].setName(String.valueOf(i + 1));
                NS.ThreadName = String.valueOf(threads[i].getName());
                threads[i].start();
            }
        }

    }
}

class ClaimSnipe implements Runnable {
    private volatile boolean exit = false;

    public String ThreadName;
    public String password;
    public int i;

    public long DropTome;

    public void stop() {
        exit = true;
    }

    @Override
    public void run() {
        long unixTimern = System.currentTimeMillis();
        while (unixTimern < (DropTome) - 1000) {
            unixTimern = System.currentTimeMillis();
        }
        System.out.println("Thread = " + ThreadName + "; i = " + i);
        stop();
    }
}

The result it gives is

Thread = 0; i = 0
Thread = 0; i = 1
Thread = 0; i = 2
Thread = 0; i = 3
Thread = 0; i = 4
Thread = 1; i = 0
Thread = 1; i = 1
Thread = 1; i = 2
Thread = 1; i = 3
Thread = 1; i = 4
Thread = 2; i = 0
Thread = 2; i = 1
Thread = 2; i = 2
Thread = 2; i = 3
Thread = 2; i = 4
Thread = 3; i = 0
Thread = 3; i = 1
Thread = 3; i = 2
Thread = 3; i = 3
Thread = 3; i = 4
Thread = 4; i = 0
Thread = 4; i = 1
Thread = 4; i = 2
Thread = 4; i = 3
Thread = 4; i = 4

Process finished with exit code 0

^^^ What i want

-----------------------------------------------------

Thread = 1; i = 0
Thread = 2; i = 1
Thread = 3; i = 2
Thread = 4; i = 3
Thread = 5; i = 4
Thread = 1; i = 0
Thread = 2; i = 1
Thread = 3; i = 2
Thread = 4; i = 3
Thread = 5; i = 4
Thread = 1; i = 0
Thread = 2; i = 1
Thread = 3; i = 2
Thread = 4; i = 3
Thread = 5; i = 4
Thread = 1; i = 0
Thread = 2; i = 1
Thread = 3; i = 2
Thread = 4; i = 3
Thread = 5; i = 4
Thread = 1; i = 0
Thread = 2; i = 1
Thread = 4; i = 3
Thread = 5; i = 4
Thread = 3; i = 2



Process finished with exit code 1

^^^ What i get...
Thread = 0; i = 0
Thread = 0; i = 1
Thread = 0; i = 2
Thread = 0; i = 3
Thread = 0; i = 4
Thread = 1; i = 0
Thread = 1; i = 1
Thread = 1; i = 2
Thread = 1; i = 3
Thread = 1; i = 4
Thread = 2; i = 0
Thread = 2; i = 1
Thread = 2; i = 2
Thread = 2; i = 3
Thread = 2; i = 4
Thread = 3; i = 0
Thread = 3; i = 1
Thread = 3; i = 2
Thread = 3; i = 3
Thread = 3; i = 4
Thread = 4; i = 0
Thread = 4; i = 1
Thread = 4; i = 2
Thread = 4; i = 3
Thread = 4; i = 4

Process finished with exit code 0

^^^ What i want

-----------------------------------------------------

Thread = 1; i = 0
Thread = 2; i = 1
Thread = 3; i = 2
Thread = 4; i = 3
Thread = 5; i = 4
Thread = 1; i = 0
Thread = 2; i = 1
Thread = 3; i = 2
Thread = 4; i = 3
Thread = 5; i = 4
Thread = 1; i = 0
Thread = 2; i = 1
Thread = 3; i = 2
Thread = 4; i = 3
Thread = 5; i = 4
Thread = 1; i = 0
Thread = 2; i = 1
Thread = 3; i = 2
Thread = 4; i = 3
Thread = 5; i = 4
Thread = 1; i = 0
Thread = 2; i = 1
Thread = 4; i = 3
Thread = 5; i = 4
Thread = 3; i = 2



Process finished with exit code 1

^^^ What i get...

I have tried changing where i call the ClaimSnipe NS but all that did was make it so only one thread was used


Solution

  • Your line 14 threads[i].setName(String.valueOf(i + 1));

    • firstly adds 1 to your for loop counter variable and refers to the loop counter variable of your INNER FOR loop.

    should be:

    threads[i].setName(String.valueOf(j));

    • which refers to loop counter variable of your OUTER FOR loop and also does not increase it by 1.

    This change will align your existing code to get your desired output. I hope this does the trick for you.