ThreadLocal Daten

Thomas Darimont

Erfahrenes Mitglied
Hallo!

Mit Thread lokalen Daten kann man Daten an einen bestimmten Thread binden, so dass wenn man aus einem bestimmten Thread nach dem Datum "greift" auch das bekommt, was man zuvor von diesem Thread aus hineingelegt hat. Sehr nützlich, für Transaktions-Objekte, Sessions , und sonstiges Zeug ;-)

C#:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace De.Tutorials.Training
{
    public class ThreadLocalExample
    {
        const string THREAD_LOCAL_DATA_KEY = "data";

        delegate void Runnable();

        public static void Main(string[] args)
        {
            ThreadStart runnable = delegate()
            {
                SetThreadLocalData("SOME_THREAD_LOCAL_DATA_OF_" + Thread.CurrentThread.Name);
                while (true)
                {
                    
                    Console.WriteLine("[{0}] Thread: {1} reads:{2} ",DateTime.Now.Ticks,Thread.CurrentThread.Name,GetThreadLocalData());
                    Thread.Sleep(1000);
                }
            };

            Thread threadA = new Thread(runnable);
            threadA.Name = "ThreadA";
            Thread threadB = new Thread(runnable);
            threadB.Name = "ThreadB";


            threadA.Start();
            threadB.Start();
        }

        private static object GetThreadLocalData()
        {
            LocalDataStoreSlot localDataStoreSlot = Thread.GetNamedDataSlot(THREAD_LOCAL_DATA_KEY);
            return Thread.GetData(localDataStoreSlot);
        }

        private static void SetThreadLocalData(object data)
        {
            LocalDataStoreSlot localDataStoreSlot = Thread.GetNamedDataSlot(THREAD_LOCAL_DATA_KEY);
            Thread.SetData(localDataStoreSlot, data);
        }
    }
}

Ausgabe:
Code:
[633030174659218750] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[633030174659218750] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[633030174669218750] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[633030174669218750] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[633030174679218750] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[633030174679218750] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[633030174689218750] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[633030174689218750] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[633030174699218750] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[633030174699218750] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[633030174709218750] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[633030174709218750] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[633030174719218750] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[633030174719218750] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[633030174729218750] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[633030174729218750] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[633030174739218750] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[633030174739218750] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[633030174749218750] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[633030174749218750] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[633030174759218750] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
...


In Java schaut das ganze so aus:
Java:
/**
 * 
 */
package de.tutorials;

import java.util.concurrent.TimeUnit;

/**
 * @author Tom
 */
public class ThreadLocalExample {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {

            ThreadLocal<String> threadLocalData = new ThreadLocal<String>();

            public void run() {
                threadLocalData.set("SOME_THREAD_LOCAL_DATA_OF_"
                        + Thread.currentThread().getName());
                while (true) {
                    System.out.printf("[%s] Thread: %s reads:%s\n", System
                            .nanoTime(), Thread.currentThread().getName(),
                            threadLocalData.get());
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };

        new Thread(runnable, "ThreadA").start();
        new Thread(runnable, "ThreadB").start();
    }
}

Ausgabe:
Code:
[4183901243047] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[4183901209229] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[4184934403935] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[4184934403557] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[4185934396952] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[4185935742587] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[4186934401846] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[4186936411590] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[4187934395703] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[4187936357181] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
[4188934406005] Thread: ThreadA reads:SOME_THREAD_LOCAL_DATA_OF_ThreadA
[4188936338407] Thread: ThreadB reads:SOME_THREAD_LOCAL_DATA_OF_ThreadB
...

Gruß Tom
 
Zurück