0 0

java多线程问题请教15

大家好,小弟刚学多线程,有个概念一直没搞懂,之前一直说如果在方法在创建多个实例对象然后调用其方法不会有线程安全问题,就是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不使用实例变量,怎么传递?

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

 

谢谢!!!!

2014年6月15日 20:42

7个答案 按时间排序 按投票排序

0 0

采纳的答案

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

2014年6月16日 11:45
0 0

拜托用代码格式器,看到这种就不想仔细阅读.累啊

2014年9月15日 11:54
0 0

public class Outputter2 {

    // 输出name
    public void output(String name) {
        int len = name.length();
        synchronized(Outputter2.class) {
        for (int i = 0; i < len; i++) {
            System.out.print(name.charAt(i));
        }
        System.out.println();
    }
}
Outputter2类改为如下再运行试试是否符合要求。ps:不好意思,第一次使用,之前发到评论那里了。

2014年6月17日 19:51
0 0

  int len = name.length();   
   for (int i = 0; i < len; i++) {
    System.out.print(name.charAt(i));
   }
   System.out.println();
   }


在执行上述代码时“System.out.print(name.charAt(i))”代码会抢时间片,所以不可能你想的那样“aaaaa”、“bbbbbb”一起打印,代码执行没有问题。

2014年6月16日 19:14
0 0

线程安全是对多个线程操作改变一个对象的全局变量而言的,你这个没涉及线程安全问题,就是多个线程打印字母了,这个线程打a,那个线程打b,排在一起了

2014年6月16日 17:29
0 0

    线程安全问题一般是存在于多个线程对共享变量的操作才引起的,你这个示例不存在线程安全问题,因为两个线程分别使用的是两个不同的对象。
    至于你说的“在方法里使用对象变量是安全的是怎么解释?”方法内部的变量都是临时变量,临时变量不存在线程安全问题,这个是java变量作用域的概念。你可以在去找资料好好看看。

2014年6月16日 10:48
0 0

挺正常的打印结果,有什么问题?
你想是什么样的?

2014年6月15日 21:31

相关推荐

    java多线程打字程序

    是一个java多线程打字程序,由于我们期末要用,所以到这里请教来了,你们这破网站还总政那个没用的麻烦不啊?

    java实验代码

    实验11 多线程处理  实验12 I/O及文件处理  实验目的:掌握并使用Java中的I/O和文件。  心得体会:对于该实验,由于比较难,只是基本掌握了文件读写的方法和规则,还有待17周JAVA实训时继续攻坚克难。 ...

    java实验,包括源程序和题目要求(很详细)

    7. **多线程**:Java提供了强大的多线程支持,通过Thread类或Runnable接口可以实现并发执行。理解线程同步和互斥的概念,以及synchronized关键字、wait()、notify()方法的使用,是进行并发编程的基础。 8. **设计...

    Java心得 学JAVA必看

    这包括但不限于Java基础语法、面向对象编程思想、集合框架、多线程编程、异常处理等内容。只有建立了完整的知识框架,才能更好地理解和运用Java语言。 #### 3. 实践出真知 理论学习固然重要,但更重要的是实践。...

    学不会的java消不了的忧愁

    3. **进阶难**:从入门到精通的过程非常漫长且充满挑战,特别是在高级特性如多线程、网络编程等方面,难度骤增。 4. **心理压力**:长时间的学习而无法看到显著进步容易让人产生挫败感,甚至放弃学习。 #### 三、...

    Java Learning Path process外文文献.doc

    此外,还要掌握IO流、多线程、网络编程等核心知识。 第五步,学习Java的高级特性,如反射、注解、动态代理等,这些特性让Java在实际开发中更具灵活性和扩展性。 第六步,接触并理解设计模式。设计模式是软件工程中...

    java培训总结.doc

    此外,培训通常还会涵盖异常处理、集合框架、IO流、多线程、网络编程等关键领域,这些都是实际开发中不可或缺的部分。 在实训过程中,学员们不仅强化了理论知识,还提升了实践能力。实训项目使学员有机会将课堂上学...

    JAVA-GAME-SOURCE-CODE.rar_Java Game code

    8. **多线程**:为了提高性能,游戏可能会使用多线程来处理不同任务,比如一个线程负责渲染,另一个线程处理游戏逻辑。 9. **资源管理**:游戏中往往有音效、图片、字体等资源,Java中的`InputStream`和`...

    java实训报告集锦7篇.docx

    1. Java多线程:在本实训中,使用Thread类创建显示时钟的线程,确保时钟动画的实时性。 2. GUI设计:运用Swing组件构建时钟界面,设置字体、颜色和布局,如使用JFrame、JLabel等。 3. 日历和时间处理:使用...

    JAVA程序员的心得

    例如,在处理并发问题时,理解计算机系统的工作原理(包括操作系统、硬件架构等)对于解决死锁、线程安全等问题至关重要。此外,深入理解网络协议(如TCP/IP)、数据库原理等也可以帮助JAVA程序员更好地设计高性能的...

    java基础入门.docxjava基础入门.docx

    - **多线程支持**:Java内置了对多线程的支持,允许开发人员轻松地编写并发程序。 - **静态类型检查**:Java是一种静态类型语言,在编译阶段就会进行类型检查,有助于提前发现并解决类型错误。 #### 二、Java基础...

    北师珠信院Java期末考试复习题.zip

    14. **Chapter 14 - 多线程**:介绍线程的创建、同步机制(synchronized、wait/notify、ReentrantLock),以及线程池。 15. **Chapter 15 - 文件与文件流**:涉及文件的创建、读写、复制,以及文件流的操作。 16. ...

    Java自学之路——(精华版)

    1. J2SE:Java标准版,包含Java基础语法、集合框架、I/O、多线程等。 2. J2EE:Java企业版,涉及Web开发、EJB、JMS、JPA等。 3. J2ME:Java微型版,主要用于嵌入式设备和移动开发。 在自学Java的过程中,持续学习和...

    2022年java学习心得体会例文.docx

    7. 线程:Java支持多线程编程,允许并发执行任务。线程管理是提高程序效率的重要手段,但同时也需要处理好同步和互斥问题,以避免数据竞争。 在学习过程中,保持信心、恒心和毅力至关重要。遇到困难时,不应轻易...

    基于JAVA的企业网站管理系统.doc

    在论文中,作者提到将Java理论知识应用于实际项目,这涵盖了Java的基础语法、类与对象、异常处理、多线程、集合框架、IO流等核心概念。在开发企业网站管理系统时,可能会涉及到数据库交互,因此Java的JDBC(Java ...

    java语言复习药店

    8. **多线程**: 复习线程的创建(通过Thread类或Runnable接口)、线程同步(synchronized关键字、wait/notify机制)、线程池等概念。 9. **网络编程**: Java提供了Socket编程接口,可以用于实现客户端和服务端的...

    JAVA网络(单机也可)聊天室加报告

    随着大众化、小型化趋势的加剧,网络聊天在当今已经不算新鲜事物,聊天室可以更好的方便大家交流,请教或探讨问题,同时也能开阔视野... 本聊天室系统,主要利用DELPHI用于底层网络通信Socket组件,使用了多线程技术。

    Java实习总结范文.pdf

    此外,实习还强化了对Java集合框架、异常处理、IO流、多线程、网络编程等进阶主题的理解。 其次,实习期间的项目实践让我们的编程能力得到了显著提升。在实际项目中,我们不仅要编写代码,还要考虑代码的可读性、可...

    java实习日记和实习报告-4400字.docx

    - Java语言的优势在于其简单性、面向对象、多线程、分布性、跨平台和安全性,这些特性使得Java成为企业级应用开发的首选语言。 - 实习生首先学习了Java编程环境,包括编译器、解释器和开发工具如Visual J++,这有...

    Java面试考核目标.docx

    - 资深/专家:能够对现有代码进行优化,具有重构能力,熟悉多线程编程等高级特性。 2. **数据库、缓存、事务等** - **考核点**:熟悉关系型数据库原理,了解SQL优化方法,掌握缓存机制(如Redis)及事务管理。 -...

Global site tag (gtag.js) - Google Analytics