Luis S
Luis S

Reputation: 73

How to use shared memory on Java threads?

I am implementing a multi-threaded program in Java, where each thread is of a type class Node extends Thread.

All these classes generate certain values which will be used by other classes.

For main it's easy to get the values from the generated threads, but from within threads itself, how can I get the values on other threads?

//Start the threads from a list of objects
for (int i = 0; i < lnode.size(); i++) { 
    lnode.get(i).start();
}

thanks

Upvotes: 7

Views: 13964

Answers (4)

Parvin Gasimzade
Parvin Gasimzade

Reputation: 26012

You can use ThreadLocal to share variables. The definition of ThreadLocal is shown below :

Thread Local can be considered as a scope of access, like a request scope or session scope. It’s a thread scope. You can set any object in Thread Local and this object will be global and local to the specific thread which is accessing this object.

You can find more information here.

Upvotes: -1

millimoose
millimoose

Reputation: 39960

If you do something like:

class MyThreadRunnable implements Runnable {
    List<String> strings;

    MyThreadRunnable(List<String> strings) {
        this.strings = strings;
    }

    public void run() {
        strings.add(getName());
    }
}

// ...

List<String> sharedStrings = new ArrayList<String>();
Thread t1 = new Thread(new MyThreadRunnable(sharedStrings));
Thread t2 = new Thread(new MyThreadRunnable(sharedStrings));

t1.start();
t2.start();

then both t1 and t2 (two different threads of the same type) will be using the same list, and see changes to it made from the other thread.

Actually, since I'm not using any synchronisation for brevity, it's also possible this would corrupt the list in some unpredictable way and cause weird errors. I strongly encourage you investigate process synchronisation, and the java.util.concurrent package when working with concurrency.

Upvotes: 5

nms
nms

Reputation: 325

If are threads of the same process/jvc instance you will not need "shared memory", you only need a reference for your data inside your treads, for example via constructor or static reference. But you will need a synchronization / control access mechanism if more than one thread writes on that data.

Upvotes: 3

OldCurmudgeon
OldCurmudgeon

Reputation: 65831

It sounds like you are looking for a ConcurrentHashMap but without a little more detail it is difficult to tell.

What kind of data are you hoping to share between these threads and how will they need to share it?

BTW - It is generally considered better to implement Runnable than to extend Thread.

Upvotes: 1

Related Questions