中易网

java中如何给Runnable线程传参?

答案:4  悬赏:30  
解决时间 2021-01-16 17:51
  • 提问者网友:niaiwoma
  • 2021-01-15 18:39
java中如何给Runnable线程传参?
最佳答案
  • 二级知识专家网友:大漠
  • 2021-01-15 18:46
Java中给Runnable线程传参数的方式如下:
向线程中传递数据的三种方法:
一、通过构造函数传递参数
public class MyThread1 extends Thread
{
    private String name;
    public MyThread1(String name)
    {
        this.name = name;
    }
    public void run()
    {
        System.out.println("hello " + name);
    }
    public static void main(String[] args)
    {
        Thread thread = new MyThread1("world");
        thread.start();        
    }
}
二、通过变量和方法传递数据
public class MyThread2 implements Runnable
{
    private String name;
    public void setName(String name)
    {
        this.name = name;
    }
    public void run()
    {
        System.out.println("hello " + name);
    }
    public static void main(String[] args)
    {
        MyThread2 myThread = new MyThread2();
        myThread.setName("world");
        Thread thread = new Thread(myThread);
        thread.start();
    }
}
三、通过回调函数传递数据
class Data
{
    public int value = 0;
}
class Work
{
    public void process(Data data, Integer numbers)
    {
        for (int n : numbers)
        {
            data.value += n;
        }
    }
}
public class MyThread3 extends Thread
{
    private Work work;

    public MyThread3(Work work)
    {
        this.work = work;
    }
    public void run()
    {
        java.util.Random random = new java.util.Random();
        Data data = new Data();
        int n1 = random.nextInt(1000);
        int n2 = random.nextInt(2000);
        int n3 = random.nextInt(3000);
        work.process(data, n1, n2, n3);   // 使用回调函数
        System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+"
                + String.valueOf(n3) + "=" + data.value);
    }
    public static void main(String[] args)
    {
        Thread thread = new MyThread3(new Work());
        thread.start();
    }
}
全部回答
  • 1楼网友:北方的南先生
  • 2021-01-15 20:53

在匿名类中,使用final修饰变量(其实基础类型也是被修饰了)
    @Test
    public void test1() {
        int app = 12;
        final Circle circle = new Circle(123);
        String string = "";
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                System.out.println(app);
                System.out.println(string);
                circle.setRadius(12);
                System.out.println(circle);
            }
        }).start();
    }
2. 当单独定义了线程通过传参的方式
1. 通过构造方法传参
2. 通过线程内部的方法传参
    class ThreadA implements Runnable {
        private Circle circle;
        
        // 方法1
        public ThreadA(Circle circle) {
            this.circle = circle;
        }
        // 方法2
        public ThreadA() {  }
        
        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println(circle.toString());
        }
        
        // 方法2
        public void setCircle(Circle circle) {
            this.circle = circle;
        }
    }
3. 修改错误,在上的回调函数中应该是 `Integer... numbers`
  • 2楼网友:雾月
  • 2021-01-15 20:17
这个要求很奇怪,run()方法作为线程的执行入口,并不管实际的业务啊。形参也是设定在你运行的方法上面吧,跟线程有什么关系呢?追问那假如我要建N个线程,这些线程的run()方法里都要调用proc(int,int)函数,那我怎么为该函数传我想要的参数呢?
如果给Runnable对象成员变量,如 private int a; private int b。再proc(a,b),那a,b会被其他线程改变,因为Runnable对象是共享的。
怎样解决这个问题?追答你能给我写个简单的例子我理解下么,对于临界资源的使用,线程本来就要经过读解锁来控制,如果你处理的变量为区域共享,就应该先解决并发的问题,如果你并不需要其他程序来改变a,b,为什么你还要当做形参传入呢?
void run(){
getmap(lat,lng);//?这里的lat,lng需要参数,怎么从servlet中获得?
}
请注意看,你这里的lat,lng是你需要传入的参数,那么如果针对不同的线程其传入的参数是不一致的,那么你就应该在run()方法里这样写
void run(){
//示意代码
int lat = Integet.paserInt(request.getAttribute("lat"));
int lng = Integet.paserInt(request.getAttribute("lng"));
getmap(lat,lng);//?这里的lat,lng需要参数,怎么从servlet中获得?
}追问试了一下,
run()是在另外一个类里面,所以没有request对象啊。追答哦 我以为你写的是servlet,这个是示意代码,但是不影响,你现在的问题就是如何取到经纬度的问题而不是线程中传参数,那么你只要将lat和ing能用你的方法取出来传进去就行了啊追问“只要将lat和ing能用你的方法取出来传进去就行了”
就是传不进去啊,我说的就是“给线程”传参,不是“线程中”传参。而如果用Runnable成员变量 lng,lat 就都共享了。
麻烦高手了,到时请你吃饭。追答这个你直接在MapRunnable设两个成员变量,然后将Ing和lat赋值给MapRunnable的成员变量,然后int lat = this.lat;
int lng = this.lng;这样行不追问已经说过了,如果用Runnable成员变量 lng,lat 就都共享了。比如:
线程A要获取 lng = 56;lat = 32 的图片;线程B要获取 lng = 0;lat = 12 的图片
怎么办?两个线程都用同一个Runnable对象,lng和lat就都一样了。
  • 3楼网友:几近狂妄
  • 2021-01-15 19:07
擦,你在Runnable实现类中定义一个有参数的方法,然后run()方法去调用该方法不就好了
不就相当于run()方法传了参数, 执行方法是在线程的栈中压入方法帧,所以不存线程安全问题,速度给分 简单的很呵呵。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息