import java.io.*; import java.util.*; public class ThreadingMain { public static void main(String[] args)throws InterruptedException { sumClass EvenThread = new sumClass("Even Thread"); sumClass OddThread = new sumClass("Odd Thread"); sumClass SumThread = new sumClass("Sum Thread"); EvenThread.start(); //OddThread.start(); //SumThread.start(); } } class sumClass extends Thread { private int EvenNumbers[] = new int[10]; private int OddNumbers[] = new int[10]; private int Sum[] = new int[10]; private String myName; public sumClass(String name) { myName = name; } public String getThreadName() { return myName; } private int[] getEvenNumbers() { for (int even = 0; even < 10; even++) { if(even%2 == 0) { for(int i = 0; i < 10; i++) { EvenNumbers[i] = even; break; } } } return EvenNumbers; } public int[] getOddNumbers() { for (int odd = 0; odd < 10; odd++) { if(odd%2 != 0) { for(int i = 0; i < OddNumbers.length; i++) { OddNumbers[i] = odd; break; } } } return OddNumbers; } public int[] Summing() { int[] Even = getEvenNumbers(); int[] Odd = getOddNumbers(); for(int i = 0; i < 10; i++) { Sum[i] = Even[i] + Odd[i]; } return Sum; } public void run() { int[] Evens = getEvenNumbers(); int[] Odds = getOddNumbers(); int[] Sums = Summing(); try { for(int i = 0; i < Evens.length; i++) { System.out.println(Evens[i]); break; } for(int i = 0; i < Odds.length; i++) { System.out.println(Odds[i]); break; } for(int i = 0; i < Sums.length; i++) { System.out.println(Sums[i]); break; } } catch(Exception e){} } }
4 Replies  440 Views  Last Post: 11 October 2012  11:50 AM
#1
cant get threads to output odd and even numbers...still
Posted 10 October 2012  06:48 PM
What am I doing wrong? I get 8,9, 17 as output. Three numbers
Replies To: cant get threads to output odd and even numbers...still
#2
Re: cant get threads to output odd and even numbers...still
Posted 10 October 2012  06:57 PM
Start each word in a class name with capital letters please.
The problem is with your inner for loops in the odd and even methods.
Every time you find a new even or odd number you are setting EVERY index of the array to that number. This means you are overwriting every index every time you are finding a new even or odd number, so the last even or odd you find will be equal to every index of the array.
In this case 0  9. 9 is the last odd. 8 is the last even. Since every index of even is 8 and every index of odd is 9. Every index of sum is 9+8 (17)
The problem is with your inner for loops in the odd and even methods.
for(int i = 0; i < 10; i++) { EvenNumbers[i] = even; break; }
Every time you find a new even or odd number you are setting EVERY index of the array to that number. This means you are overwriting every index every time you are finding a new even or odd number, so the last even or odd you find will be equal to every index of the array.
In this case 0  9. 9 is the last odd. 8 is the last even. Since every index of even is 8 and every index of odd is 9. Every index of sum is 9+8 (17)
#3
Re: cant get threads to output odd and even numbers...still
Posted 10 October 2012  07:10 PM
oh damn!
wait so how do i get the numbers into the array without overwriting?
wait so how do i get the numbers into the array without overwriting?
#4
Re: cant get threads to output odd and even numbers...still
Posted 10 October 2012  07:25 PM
There are 3 ways to do this. They are going to go in order of easiest to hardest.
1.Instead of arrays. Use a collection. (This isn't always a option and is actually probably just as difficult as option 2)
2.Keep a counter for the even array, and the odd array. Start the counter at 0, and every time you find a new odd or even use the counter as the index. Then add 1 to the counter.
3. Make a method that can return the next empty index in an array. Since you did not initialize your arrays the next empty value will be 0. Just loop through the array. Look for 0. When you find the first index that is equal to 0, return that index. That will be the index you can use to set your next value.
1.Instead of arrays. Use a collection. (This isn't always a option and is actually probably just as difficult as option 2)
2.Keep a counter for the even array, and the odd array. Start the counter at 0, and every time you find a new odd or even use the counter as the index. Then add 1 to the counter.
3. Make a method that can return the next empty index in an array. Since you did not initialize your arrays the next empty value will be 0. Just loop through the array. Look for 0. When you find the first index that is equal to 0, return that index. That will be the index you can use to set your next value.
#5
Re: cant get threads to output odd and even numbers...still
Posted 11 October 2012  11:50 AM
Another point to make is that the way you structured this, your threads are not actually talking to each other.
The reason you had to comment the start methods or your oddThread and sumThread objects is that every one of the three threads you created will fill the even array, then fill the odd array, then calculate the sum  uncommenting the start methods will actually run the whole sequence 3 times.
Some hints for you:
Hope this helps.
EDIT: Also note that the Odd and Even threads are doing the exact same thing, the only difference is that one of them starts from 0 and the other starts from 1
The reason you had to comment the start methods or your oddThread and sumThread objects is that every one of the three threads you created will fill the even array, then fill the odd array, then calculate the sum  uncommenting the start methods will actually run the whole sequence 3 times.
Some hints for you:
 You do not need arrays, you only need to print the sum of the latest odd and even numbers
 You will need 3 threads, 2 that count and 1 that sums
 You need to use "synchronized" code or some kind of Lock object
 Your counter threads should wait for sum to finish printing
 Your summing thread should wait for the counter to have a new number in some "static" variable
Hope this helps.
EDIT: Also note that the Odd and Even threads are doing the exact same thing, the only difference is that one of them starts from 0 and the other starts from 1
This post has been edited by rfs02: 11 October 2012  01:47 PM
Page 1 of 1
