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中获得?
}
} 展开
*要形参,不要实参!!!(就是非共享的参数)
因为是共有的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中获得?
}
} 展开
5个回答
展开全部
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();
}
}
展开全部
擦,你在Runnable实现类中定义一个有参数的方法,然后run()方法去调用该方法不就好了
不就相当于run()方法传了参数, 执行方法是在线程的栈中压入方法帧,所以不存线程安全问题,速度给分 简单的很呵呵。
不就相当于run()方法传了参数, 执行方法是在线程的栈中压入方法帧,所以不存线程安全问题,速度给分 简单的很呵呵。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
class MapRunnable implements Runable{
Float lng,lat;
public MapRunnable (Float lng,Float lat){//动态的在构造中传入或者属性都可以
this.lng=lng;
this.lat=lat;
}
public static MapParam=;//共有的就用静态变量
}
Float lng,lat;
public MapRunnable (Float lng,Float lat){//动态的在构造中传入或者属性都可以
this.lng=lng;
this.lat=lat;
}
public static MapParam=;//共有的就用静态变量
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在匿名类中,使用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`
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个要求很奇怪,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中获得?
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询