java中如何给Runnable线程传参?

RT,创建N个Thread线程,共用同一个Runnable对象。要求给Runnable中的run()方法提供参数。*要形参,不要实参!!!(就是非共享的参数)因为是共有的... RT,创建N个Thread线程,共用同一个Runnable对象。要求给Runnable中的run()方法提供参数。
*要形参,不要实参!!!(就是非共享的参数)
因为是共有的Runnalbe对象,所以成员变量都是共享的,不能传形参。
例子:某servlet中负责接收经纬度数据,并创建多个线程来获取对应经纬度的图片
//lng,lat 经纬度,已经获得
init(){
MapRunnable mrun = new MapRunnable(mapfile);
}
void doGet(){
lng=
lat=
Thread thr = new Thread(MapRunnable);
thr.start();
}
class MapRunnable implements Runnable{
MapParam mp = //这是Runnable都共有的
void run(){
getmap(lat,lng);//?这里的lat,lng需要参数,怎么从servlet中获得?
}
}
展开
 我来答
小傻

2015-10-23 · 知道合伙人软件行家
小傻
知道合伙人软件行家
采纳数:11567 获赞数:31136
已经做过两个上架的app和两个网页项目.

向TA提问 私信TA
展开全部

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();
    }
}
churchchencgd
2012-03-29
知道答主
回答量:25
采纳率:0%
帮助的人:17万
展开全部
擦,你在Runnable实现类中定义一个有参数的方法,然后run()方法去调用该方法不就好了
不就相当于run()方法传了参数, 执行方法是在线程的栈中压入方法帧,所以不存线程安全问题,速度给分 简单的很呵呵。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友1636cc9
2019-03-20
知道答主
回答量:7
采纳率:100%
帮助的人:5477
展开全部
class MapRunnable implements Runable{
Float lng,lat;
public MapRunnable (Float lng,Float lat){//动态的在构造中传入或者属性都可以
this.lng=lng;
this.lat=lat;
}
public static MapParam=;//共有的就用静态变量
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
槐树树根
2018-05-28
知道答主
回答量:15
采纳率:0%
帮助的人:4.8万
展开全部
  1. 在匿名类中,使用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`

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liyi830813
2012-03-29 · TA获得超过952个赞
知道小有建树答主
回答量:1034
采纳率:0%
帮助的人:968万
展开全部
这个要求很奇怪,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中获得?
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式