简体   繁体   中英

Defining two different Threads in java

Im new to Threads and I was wondering how could I define what two or more different Threads do in a Java program. Do i define them all in the same public void run method? If so, how do I do it? I would like the Threat t1 to invoke the increment method, t2 to invoke the decrement method and both of them to call the value method

Here's the code example:

package interference;

/**
*
* @author rodrigopeniche
*/
public class Interference implements Runnable{

/**
 * @param args the command line arguments
 * 

 */

Counter counter1= new Counter();

class Counter{

    private int c= 0;

    public void increment()
    {
        c++;
    }

    public void decrement()
    {
        c--;
    }

    public int value()
    {
        return c;
    }

}

public static void main(String[] args) {
    // TODO code application logic here


 Thread t1= new Thread(new Interference());
 Thread t2= new Thread(new Interference());
 t1.start();
 t2.start();

}



@Override
public void run() {

counter1.increment();
counter1.decrement();
counter1.value();



}

}

You can set names to threads like thread1, thread2 . After that, in the run method, check the name of the thread currently running and do the necessary action.

You have to add a while loop inside the run method if you need to run it longer.

public static void main(String[] args) {

    Interference interference = new Interference();//create a new Interference object

    Thread t1 = new Thread(interference, "thread1");//pass the runnable interference object and set the thread name
    Thread t2 = new Thread(interference, "thread2");//pass the runnable interference object and set the thread name
    t1.start();
    t2.start();
}

@Override
public void run() {

    while (true) {//to run it forever to make the difference more visual

        String threadName = Thread.currentThread().getName();//get the current thread's name
        if (threadName.equals("thread1")) {//if current thread is thread1, increment
            counter1.increment();
        } else if (threadName.equals("thread2")) {//if current thread is thread2, decrement
            counter1.decrement();
        }

        System.out.println(counter1.value());//print the value
    }
}

When you run the code, you can see count is going up and down in a random manner.

In your current code, counter1 is an instance variable of class Interference . You create 2 instances of Interference and then use them to create two Thread objects. When the threads start to run, each Thread is actually working on it's own copy of counter1 . I think that may not be what you expect.

package interference;

public class Interference {
    static class Counter {
        private int c = 0;

        public void increment() {
            c++;
        }

        public void decrement() {
            c--;
        }

        public int value() {
            return c;
        }
    }

    public static void main(String[] args) {
        Counter counter = new Counter();

        Thread t1 = new Thread(new Runnable() {
            public void run() {
                counter.increment();
                System.out.println(counter.value());
            }
        });
        Thread t2 = new Thread(new Runnable() {
            public void run() {
                counter.decrement();
                System.out.println(counter.value());
            }
        });
        t1.start();
        t2.start();
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM