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 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64
  • ¥15 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示
  • ¥15 扫描项目中发现AndroidOS.Agent、Android/SmsThief.LI!tr
  • ¥15 怀疑手机被监控,请问怎么解决和防止
  • ¥15 Qt下使用tcp获取数据的详细操作