java多线程 参数已经传入构造方法 进入run方法时参数却被改变

问题描述

java多线程 参数已经传入构造方法 进入run方法时参数却被改变
请教各位大神:我在for循环里面执行线程,遇到一个问题,代码如下:
private static final ExecutorService executors = Executors.newScheduledThreadPool(10);
......
for(...){
executors.execute(new PublishThread(map));
}
PublishThread实现了Runnable方法,它有一个私有成员变量map,在PublishThread有一个构造函数,接受了上面的map参数,并将它赋给私有成员变量map。调试的时候发现到构造函数里面时,map值与for循环里面传过来的值是匹配的,但是到run方法里面时,map里面的值却被改变。比如3次for循环传进的参数分别为:{classId=10295 class_ids=[10295 10325 10327]},{classId=10292 class_ids=[10292]}{classId=10293 class_ids=[10293]}但是3次run里面看到的值确是{classId=10295 class_ids=[10293]},{classId=10292 class_ids=[10293]},{classId=10293 class_ids=[10293]},这已经不是顺序乱掉的问题(顺序乱本正常),而是变量里面乱了。请问这有可能是什么原因导致的呢?有什么措施可以让这个map不被改变?

时间: 2024-10-30 12:38:01

java多线程 参数已经传入构造方法 进入run方法时参数却被改变的相关文章

java中dopost和doget这两个方法的参数是一样的,那其他方面有什么不一样呢

问题描述 java中dopost和doget这两个方法的参数是一样的,那其他方面有什么不一样呢 java中dopost和doget这两个方法的参数是一样的,那其他方面有什么不一样呢 解决方案 一个是http post,一个是http get,get类似你浏览器里请求一个页面,post相当于表单提交.post可以发送比较多的参数给服务器.get只能在url上附着少量的参数. 解决方案二: 客户端请求方式不一样,而且对于表单,post方式会自动把里面的信息当做参数提交具体的参考http://www.

javaee-打jar包后__在调用 jar包里面的方法时,参数显示全部是arg0,arg1,arg2

问题描述 打jar包后__在调用 jar包里面的方法时,参数显示全部是arg0,arg1,arg2 打jar包后__在调用 jar包里面的方法时,参数显示全部是arg0,arg1,arg2 解决方案 因为你的使用的jar包中没有源码,如果你有源码就会有显示和别人一样的名称. 解决方案二: 关联jar包中的源码就行

Java多线程编程实战之不提倡的方法

不提倡使用的方法是为支持向后兼容性而保留的那些方法,它们在以后的版本中可能出现,也可能不出现.Java 多线程支持在版本 1.1 和版本 1.2 中做了重大修订,stop().suspend() 和 resume() 函数已不提倡使用.这些函数在 JVM 中可能引入微妙的错误.虽然函数名可能听起来很诱人,但请抵制诱惑不要使用它们. 调试线程化的程序 在线程化的程序中,可能发生的某些常见而讨厌的情况是死锁.活锁.内存损坏和资源耗尽. 死锁 死锁可能是多线程程序最常见的问题.当一个线程需要一个资源而

Java线程入门——定义线程中的 run 方法

run 方法是运行线程时需要执行的代码.(你要用代码--也就是 run() 方法--来描述一个处理过程,而不是创建一个表示这个处理过程的对象.在如何理解线程方面,一直存在着争议.这取决于,你是将线程看作是对象还是处理过程.如果你认为它是一个处理过程,那么你就摆脱了"万物皆对象"的 OO 教条.但与此同时,如果你只想让这个处理过程掌管程序的某一部分,那你就没理由让整个类都成为 Runnable 的.有鉴于此,用内部类的形式将线程代码隐藏起来,通常是个更明智的选择.来自TIJ3.) 在 J

详解Java多线程编程中CountDownLatch阻塞线程的方法_java

直译过来就是倒计数(CountDown)门闩(Latch).倒计数不用说,门闩的意思顾名思义就是阻止前进.在这里就是指 CountDownLatch.await() 方法在倒计数为0之前会阻塞当前线程. CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. CountDownLatch 的作用和 Thread.join() 方法类似,可用于一组线程和另外一组线程的协作.例如,主线程在做一项工作之前需要一系列的准备工作,只有这些准备工

Java多线程编程基础之非线程的方法

[wait(),notify()/notityAll()方法] 关于这两个方法,有很多的内容需要说明.在下面的说明中可能会有很多地方 不能一下子明白,但在看完本节后,即使不能完全明白,你也一定要回过头来记住 下面的两句话: [wait(),notify()/notityAll()方法是普通对象的方法(Object超类中实现), 而不是线程对象的方法] [wait(),notify()/notityAll()方法只能在同步方法中调用] [线程的互斥控制] 多个线程同时操作某一对象时,一个线程对该对

ExtJs中使用TaskRunner和DelayedTask如何传参数到run()方法

在 ExtJs 中支持多线程的类有 Ext.util.TaskRunner 和 Ext.util.DelayedTask.TaskRunner 提供 了多线程的定时服务,DelayedTask 允许你延时多久在新建线程中执行一个任务.Ext.TaskMgr 是一个 TaskRunner 实例,在 TaskMgr.js 源码中可以看到最后一行是: Ext.TaskMgr = new Ext.util.TaskRunner(); 实质上不管是 TaskRunner 还是 DelayedTask,它们

《Java多线程编程核心技术》——1.2节使用多线程

1.2 使用多线程想学习一个技术就要"接近"它,所以在本节,首先用一个示例来接触一下线程.一个进程正在运行时至少会有1个线程在运行,这种情况在Java中也是存在的.这些线程在后台默默地执行,比如调用public static void main()方法的线程就是这样的,而且它是由JVM创建的.创建示例项目callMainMethodMainThread,创建Test.java类.代码如下: package test; public class Test { public static

在java多线程中用while循环和for循环输出的结果不同

问题描述 在java多线程中用while循环和for循环输出的结果不同 public class Demo14 { public static void main(String[] args) throws InterruptedException { MyThread2 thread2 = new MyThread2(); Thread t = new Thread(thread21""); Thread t1 = new Thread(thread22"");