Java如何为一个线程传递一个额外的对象

时间:2013-07-02 16:53:24

标签: java multithreading runnable

我不认为这是可能的,但我想告诉我的每个线程都在处理特定的对象。像这样排序 -

class Tester implements Runnable{
    String s1, s2;
    Thread t1, t2;

    test(){
        t1 = new Thread(this, "t1");
        t2 = new Thread(this, "t2");
        t1.start();
        t2.start();
    }

    public void run(){
        if(this is t1){
            s1="s1";
        }
        if(this is t2){
            s2="s2";
        }
    }
}

我想以某种方式告诉thread t1string s1t2 s2上运行代码。现在我只是通过检查Thread.currentThreat.getName()来做到这一点,但这不是一个好方法。另一种方法是创建一个匿名的Runnable类,它有自己的字符串,只有run,但那么主线程如何获得两个字符串?

2 个答案:

答案 0 :(得分:8)

为什么不传递不同的Thread个不同的Runnable s?

Runnable r1 = new Runnable() { public void run() { /* this is r1 */ } };
Runnable r2 = new Runnable() { public void run() { /* this is r2 */ } };
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();

/编辑

创建一个可以实例化的类:

public class MyRunnable implements Runnable {
    private final String s;

    public MyRunnable(Stirng s) {
        this.s = s;
    }

    public void run() {
        // do something with s
    }
}

Thread t1 = new Thread(new MyRunnable("s1"));
Thread t2 = new Thread(new MyRunnable("s2"));
t1.start();
t2.start();

/ E2

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class ExecutorServiceExample {
    private static class CallableExample implements Callable<Integer> {
        private final Object foo;

        private CallableExample(Object foo) {
            this.foo = foo;
        }

        @Override
        public Integer call() {
            // do something and return it
            return foo.hashCode();
        }

    }

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService e = Executors.newFixedThreadPool(2);
        Future<Integer> f1 = e.submit(new CallableExample("foo"));
        Future<Integer> f2 = e.submit(new CallableExample("bar"));

        System.out.println(f1.get());
        System.out.println(f2.get());

        e.shutdown();
    }
}

Here是关于Executor框架的好教程。

答案 1 :(得分:0)

我建议使用Thread Local

您可以访问herehere

中的虚拟示例