A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© DuckJava 中级黑马   /  2014-12-21 16:15  /  1252 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

并不是在钻牛角尖,是对程序的调用和多线程不理解,希望大神指教
  1. //--为什么我在sum += n;上面进行try也会发生输出错误,
  2. //--不是应该在sum += n 和输出语句之间try 才会发生异常的么??
  3. class Bank
  4. {
  5.         private int sum;
  6.         public void add(int n)
  7.         {
  8.                 try{Thread.sleep(200);}catch(Exception e){}
  9.                 sum += n;
  10.                 System.out.println("sum = "+sum);
  11.         }
  12. }
  13. class Cus implements Runnable
  14. {
  15.         private Bank b = new Bank();
  16.         public void run()
  17.         {
  18.                
  19.                 for(int x=0;x<3;x++)
  20.                 {
  21.                         b.add(100);
  22.                 }
  23.         }
  24. }
  25. class RunnableDemo
  26. {
  27.         public static void main(String[] args)
  28.         {
  29.                 Cus c = new Cus();
  30.                 Thread t1 = new Thread(c);
  31.                 Thread t2 = new Thread(c);
  32.                 t1.start();
  33.                 t2.start();
  34.         }
  35. }
复制代码

/*---
sum = 100
sum = 100
sum = 200
sum = 300
sum = 400
sum = 500
*/

15 个回复

倒序浏览
如果2条线程 同时访问实例 一定要锁住   对实例变量进行修改操作 的 方法! 给Bank类的add 方法前面加上synchronize ,就能保证程序的正常运行
回复 使用道具 举报
如有不懂 可以继续问我
回复 使用道具 举报
刚刚没好好看你的说明 只看了你的代码 ,线程还涉及到一个时间片分配的问题。这有很多种解释。
回复 使用道具 举报

      你把         System.out.println("sum = "+sum) 放到 sum += n 上面 ,就会知道原因;
回复 使用道具 举报
{:3_59:}运行没异常,就是数据没同步,搞不懂问什么,
回复 使用道具 举报
本帖最后由 DuckJava 于 2014-12-21 20:53 编辑
程梦真 发表于 2014-12-21 18:08
如有不懂 可以继续问我


好,我很喜欢这句话。那么,我有另外一个代码问题。这个代码的问题我不去纠结了,因为视频上面已经给出了解决方法。看下面这段代码,我如何使用同步函数让其同步?如果不可以使用同步函数来同步,为什么不可以使用同步函数不对。(ps:如果我直接synchronized show();是不行的,这个我试过了。)

//--如何使用同步函数,不是同步代码块来解决这其中的安全问题???
  1. //--如何使用同步函数,不是同步代码块来解决这其中的安全问题???
  2. class SellTicket
  3. {
  4. public static void main(String[] args)
  5. {
  6. Ticket t1 = new Ticket();
  7. Ticket t2 = new Ticket();
  8. Ticket t3 = new Ticket();
  9. Ticket t4 = new Ticket();
  10. t1.start();
  11. t2.start();
  12. t3.start();
  13. t4.start();
  14. }
  15. }
  16. class Ticket extends Thread
  17. {
  18. //static Object obj = new Object();
  19. private static int tick = 1000;
  20. public void run() // Thread-0..sale 0 Thread-1..sale -1 Thread-2..sale -2
  21. {
  22. while(true)
  23. {
  24. //synchronized(obj) // Thread-0..sale 0 Thread-1..sale -1 Thread-2..sale -2
  25. //{
  26. show();
  27. //}

  28. }
  29. }
  30. public void show()
  31. {
  32. if (tick>0)
  33. {
  34. try{Thread.sleep(10);}catch(Exception e){}
  35. System.out.println(currentThread().getName()+"..Thread-sale "+tick--);
  36. }
  37. }
  38. }
复制代码


回复 使用道具 举报
  1. package itheima;

  2. public class SellTicket {
  3.         public static void main(String[] args){
  4.                 Ticket ticket = new Ticket();
  5.                 TicketThread t1 = new TicketThread(ticket);
  6.                 TicketThread t2 = new TicketThread(ticket);
  7.                 TicketThread t3 = new TicketThread(ticket);
  8.                 TicketThread t4 = new TicketThread(ticket);
  9.                 t1.start();
  10.                 t2.start();
  11.                 t3.start();
  12.                 t4.start();
  13.         }
  14. }
  15. class TicketThread extends Thread{
  16.         private final Ticket  ticket;
  17.         //static Object obj = new Object();
  18.         public TicketThread(Ticket ticket){
  19.                 this.ticket = ticket;
  20.         }
  21.         public void run() // Thread-0..sale 0 Thread-1..sale -1 Thread-2..sale -2
  22.         {
  23.                 while(true){
  24.                 //synchronized(obj) // Thread-0..sale 0 Thread-1..sale -1 Thread-2..sale -2
  25.                 //{
  26.                         ticket.show();
  27.                 //}
  28.                 }
  29.         }
  30.        
  31. }
  32. class Ticket{
  33.         private static int tick = 1000;
  34.         public synchronized void show(){
  35.                 if (tick>0){
  36.                         try{
  37.                                 Thread.sleep(10);
  38.                         }catch(Exception e){
  39.                                
  40.                         }
  41.                         System.out.println(Thread.currentThread().getName()+"..Thread-sale "+tick--);
  42.                 }
  43.         }
  44. }
复制代码

你先试一下这个 我改造过后的代码, 我还是推荐你先看java多线程设计模式,耐心看下来,对你的帮助会很大
回复 使用道具 举报
当你遇到问题的时候,可以打个断点debug,或者输出语句跟踪一下,千万不要有一遇到问题就忍不住很烦,想问别人的心态。实际开发中有时候一个类都是几千行代码,养成debug的习惯对你以后的开发,和理解都会有好处,希望你能学习一下
回复 使用道具 举报
程梦真 发表于 2014-12-21 21:18
你先试一下这个 我改造过后的代码, 我还是推荐你先看java多线程设计模式,耐心看下来,对你的帮助会很大 ...

大哥,我就问你,你在看视频的过程中有没有过困惑,或者遇到不懂的地方?你遇到不懂的时候怎么办?是继续往下看视频?难道不是把当前问题解决掉?。。如果你有问题,视频上面又没有给你解答,你怎么办?
回复 使用道具 举报
我觉得你的错误就是因为,你模糊了线程和实例的概念,在你的这个程序里,没有实例,所以我添加了一个类。希望能帮到你
回复 使用道具 举报
程梦真 发表于 2014-12-21 21:22
当你遇到问题的时候,可以打个断点debug,或者输出语句跟踪一下,千万不要有一遇到问题就忍不住很烦,想问 ...

好的,谢谢你一直心平气和的回答我的问题。我刚才在网上下载了一本pdf的java多线程设计模式。但是有点模糊,你要清晰版的么?求分享。
回复 使用道具 举报
还有你的编码习惯很不好,希望你能改进,记得一定要,编码要规范,不要都顶格,这样会被boss骂哦~亲
回复 使用道具 举报
DuckJava 发表于 2014-12-21 21:22
大哥,我就问你,你在看视频的过程中有没有过困惑,或者遇到不懂的地方?你遇到不懂的时候怎么办?是继续 ...

648270773加我q
回复 使用道具 举报
DuckJava 发表于 2014-12-21 21:22
大哥,我就问你,你在看视频的过程中有没有过困惑,或者遇到不懂的地方?你遇到不懂的时候怎么办?是继续 ...

之前我学java也是很困惑,都会经历这个阶段,其实看不懂多看几遍,一定要在脑袋里有个模型,心急吃不了热豆腐,慢慢来,还有一定要练,这种事情就像炒饭一个,你把东西放进锅里,直接烧就能熟吗?一样的道理,记下来的东西放进脑袋里,多炒几遍(多练几遍)自然就熟了
回复 使用道具 举报
DuckJava 发表于 2014-12-21 21:41
好的,谢谢你一直心平气和的回答我的问题。我刚才在网上下载了一本pdf的java多线程设计模式。但是有点模 ...

这个打包后也38M无发上传,如果需要可以加我Q
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马