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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘勇强 中级黑马   /  2013-3-7 16:26  /  1421 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘勇强 于 2013-3-7 21:57 编辑
  1. class MyThread implements java.lang.Runnable
  2. {
  3.         private int threadId;

  4. public MyThread(int id)
  5. {
  6. this.threadId = id;
  7. }

  8. public synchronized void run()
  9. {
  10. for (int i = 0; i < 100; ++i)
  11. {
  12. System.out.println("Thread ID: " + this.threadId + " : " + i);
  13. }
  14. }
  15. }

  16. public class ThreadDemo
  17. {

  18. public static void main(String[] args) throws InterruptedException
  19. {
  20. for (int i = 0; i < 10; ++i)
  21. {
  22. new Thread(new MyThread(i)).start();
  23. Thread.sleep(1);
  24. }
  25. }

  26. }
复制代码
在run()方法中加入了synchronized关键字,希望能对run方法进行互斥访问,结果总不对  

4 个回复

倒序浏览
这你想达到什么效果,这不是十个单线程吗?不能理解你的互斥访问是什么意思.
你要理解多线程的概念,是多个线程共同操作一个任务,达到提高效率的方式...
回复 使用道具 举报
不是很明白你说的互斥访问是什么,但我想你说的应该就是两个以上线程不能同时访问一个资源,互相排斥访问吧,也就是我们常说的同步。
如果这样的话,你的问题就很好解决了,同步的前提是共用一个锁,而sychronized语句的锁是this,也就是调用语句本身所在对象,而你这里
的多个线程的锁都是一个新的MyThread对象,明显不满足共用锁的条件,另外不是很明白你写在第27行的Thread.sleep(1);的用意,放在这里
这句话发挥的作用是让主线程暂时休眠而不是任何新建线程,我想你的意思大概是想让一个子线程启动后,休眠下,看下一个新建的线程是否

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
你new了十个对象,每个对象都有一份属于自己的run()代码,它们相互独立的,这样子都各玩自已的那一分代码了,
回复 使用道具 举报


不是很明白你说的互斥访问是什么,但我想你说的应该就是两个以上线程不能同时访问一个资源,互相排斥访问吧,也就是我们常说的同步
如果这样的话,你的问题就很好解决了,同步的前提是共用一个锁,而sychronized语句的锁是this,也就是调用语句本身所在对象,而你这里
的多个线程的锁都是一个新的MyThread对象,明显不满足共用锁的条件,另外不是很明白你写在第27行的Thread.sleep(1);的用意,放在这里
这句话发挥的作用是让主线程暂时休眠而不是任何新建线程,不过我想你的意思大概是想让一个子线程启动后,休眠下,看下一个新建的线程是
否还能再次访问共享资源吧。我把代码修改了下,应该能满足你的需要。
  1. class MyThread implements java.lang.Runnable
  2. {
  3.    
  4.         public MyThread()
  5.         {
  6.                
  7.         }

  8.         public synchronized void run() throws InterruptedException
  9.         {
  10.                 for (int i = 0; i < 100; ++i)
  11.                 {
  12.                         //这么做是为了在输出时区分线程,当然,你也可以通过setName()来自命名
  13.                         System.out.println(Thread.currentThread().getName() + " : " + i);
  14.                 }
  15.                 //在这里休眠,看新线程是否能访问共用资源
  16.                 Thread.sleep(1);
  17.         }
  18. }

  19. public class ThreadDemo
  20. {

  21.         public static void main(String[] args) throws InterruptedException
  22.         {
  23.                
  24.                 //建立共用锁
  25.                 MyThread a = new MyThread();
  26.                 for (int i = 0; i < 10; ++i)
  27.                 {
  28.                         new Thread(a).start();
  29.                        
  30.                 }
  31.         }

  32. }
复制代码
希望我的回答能帮助你。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马