leeboysam 2014-06-15 20:42
浏览 199
已采纳

java多线程问题请教

大家好,小弟刚学多线程,有个概念一直没搞懂,之前一直说如果在方法在创建多个实例对象然后调用其方法不会有线程安全问题,就是struts2 都说每个请求创建了一个新的实例就不会有线程问题。

 

那我做了个例子,运行结果一直都有问题,特请教

 

有2个类

 

public class Outputter2 {

//输出name
 public void output(String name) {
  int len = name.length();   
   for (int i = 0; i < len; i++) {
    System.out.print(name.charAt(i));
   }
   System.out.println();
   }

}

 

///////////////////////////

public class Outputter4 implements Runnable {

 private String name;
 
 public Outputter4(String name){
  this.name = name;
 }
 
 @Override
 public void run() {

  while (true) {
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   //System.out.println(name);
   new Outputter2().output(name);

  }
  
 }
 
 public static void main(String[] args) {

//每次都创建新的Outputter4
  new Thread(new Outputter4("aaaa")).start();
  new Thread(new Outputter4("bbbb")).start();
 }

}

 

打印效果,不正确:

aaaa
bbbb
abbbb
aaa
bbbb
aaaa
baaaa
bbb
aaaa

 请帮忙解释,我一直没弄明白错在那里?

 是不是由于name引起的,如果name不使用实例变量,怎么传递?

  在方法里使用对象变量是安全的是怎么解释?

 

谢谢!!!!

  • 写回答

7条回答 默认 最新

  • iteye_11694 2014-06-16 11:45
    关注

    我感觉你说的不正确是那因为打印出来的东西,不是aaaa bbbb 这种格式,而是有abbbb这种ab混合的形式,这个问题是因为jvm是的cpu是抢占式调度,也就是说相同的优先级,cpu会随机选择一个线程运行,而且一个线程没运行完有可能虚拟机也会让当前线程暂时放弃CPU,转到就绪状态,使其它线程获得运行机会。
    换句话说多个线程同时运行你根本控制不住。
    转到你的问题上,就是可能线程1运行for循环打印a的时候,线程2抢到cpu就打印b了,就这样交叉运行得到了你那结果。
    而你说的安全,多线程的时候安全主要针对的是共享资源的安全,你这上面各个线程各自new了自己的对象,用的都是局部变量,所以不存在线程安全问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发