I the program I wish to run is a search for a number in 4 threads. Its working out fine and here is the code.

import java.lang.Math;
import java.lang.Thread;
public class NumberFinder
{
    public static void main(String args[])
    {
        int target = (int) (Math.random()*1000);
        System.out.println("The number is " + target);

        Thread thread0 = new Finder(target, 0, 249);
        Thread thread1 = new Finder(target, 250, 499);
        Thread thread2 = new Finder(target, 500, 749);
        Thread thread3 = new Finder(target, 750, 1000);
        thread0.start();
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

class Finder extends Thread
{

    int searchFor;
    int beginRange;
    int endRange;



    public Finder(int searchFor, int beginRange, int endRange)
    {
        this.searchFor = searchFor;
        this.beginRange = beginRange;
        this.endRange = endRange;
        System.out.println ("in constructor " + this.getName() + " " + beginRange + " " + endRange);
    }


    public void run()
    {
        for (int i = beginRange; i < endRange; i++){


            if (searchFor == i){

                System.out.println("found at " +this.getName()+ " and the number is "+  i);
            }

        }
    }
}

Now I wish to use Runnable instead of extends Thread

import java.lang.Math;
import java.lang.Thread;
public class NumberFinder
{
    public static void main(String args[])
    {
        int target = (int) (Math.random()*1000);
        System.out.println("The number is " + target);

        Thread thread0 = new Finder(target, 0, 249);
        Thread thread1 = new Finder(target, 250, 499);
        Thread thread2 = new Finder(target, 500, 749);
        Thread thread3 = new Finder(target, 750, 1000);
        thread0.start();
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

class Finder implements Runnable
{
     Thread t = Thread.currentThread();
    int searchFor;
    int beginRange;
    int endRange;



    public Finder(int searchFor, int beginRange, int endRange)
    {
        t.searchFor = searchFor;
        t.beginRange = beginRange;
        t.endRange = endRange;
        System.out.println ("in constructor " + t.getName() + " " + beginRange + " " + endRange);
    }


    public void run()
    {
        for (int i = beginRange; i < endRange; i++){


            if (searchFor == i){

                System.out.println("found at " +this.getName()+ " and the number is "+  i);
            }

        }
    }
}

But this code is not compiling. How to correct the code?

Recommended Answers

All 6 Replies

Since Finder is no longer a subclass of thread, you cannot store a Thread reference to it. Use Thread thread0 = new Thread(new Finder(target, 0, 249));

Since Finder is no longer a subclass of thread, you cannot store a Thread reference to it. Use Thread thread0 = new Thread(new Finder(target, 0, 249));

Thanks a lot! that fixed it.

I made a mistake I executed the old program by mistake.

import java.lang.Math; import java.lang.Thread; public class NumberFinder { public static void main(String args[]) {
        int target = (int) (Math.random()*1000);
        System.out.println("The number is " + target);
        Thread t = Thread.currentThread();
        Thread thread0 = new Thread(new Finder(target, 0, 250));
        Thread thread1 = new Thread(new Finder(target, 251,500 )); Thread thread2 = new Thread(new Finder(target,501, 750)); Thread thread3 = new Thread(new Finder(target,751, 1000));
        thread0.start();
        thread1.start();
        thread2.start();
        thread3.start(); } } class Finder implements Runnable { int searchFor; int beginRange; int endRange; public Finder(int searchFor, int beginRange, int endRange) { Thread t = Thread.currentThread();
        t.searchFor = searchFor;
        t.beginRange = beginRange;
        t.endRange = endRange;
        System.out.println ("in constructor " + t.getName() + " " + beginRange + " " + endRange); } public void run() {
        for (int i = beginRange; i < endRange; i++){ 
        if (searchFor == i){ 
        System.out.println("found at " +t.getName()+ " and the number is "+ i);
        } 
        } } }
C:\Users\>javac NumberFinder.java NumberFinder.java:32: cannot find symbol symbol : variable searchFor location: class java.lang.Thread
        t.searchFor = searchFor;
        ^ NumberFinder.java:33: cannot find symbol symbol : variable beginRange location: class java.lang.Thread
        t.beginRange = beginRange;
        ^ NumberFinder.java:34: cannot find symbol symbol : variable endRange location: class java.lang.Thread
        t.endRange = endRange;
        ^ NumberFinder.java:46: cannot find symbol symbol : variable t location: class Finder
        System.out.println("found at " +t.getName()+ " and the number is "+ i);
        ^ 4 errors

Can somebody help me out here?

In method main write

Finder thread0 = new Finder(target, 0, 249);//4x change type of Thread->Finder

In constructor Finder 4x change

this.searchFor = searchFor; // change t. -> this.

Replace

Thread t = new Thread(this);//Thread.currentThread();

Write own method to start thread.

//

Of course kind of view presented by nmaillet is good too.

Use Thread thread0 = new Thread(new Finder(target, 0, 249));

In both cases you need

In constructor Finder 4x change
this.searchFor = searchFor; // change t. -> this.

Inside main method line

Thread t = Thread.currentThread();

is no needed.
Inside Finder constructor you don't need the line

Thread t = Thread.currentThread();

In both println methods use simply static metod

... + Thread.currentThread().getName() + ...

to reflect actual (not stored) name of thread.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.