黑马程序员技术交流社区

标题: 多线程 [打印本页]

作者: 高廷平    时间: 2012-8-27 14:25
标题: 多线程
package Demo_Test;
public class Demo_Thread {
public static void main(String[] args) {
  //同步
  new Thread(new MyThread_synchronized()).start();
  
  
  /*创建匿名线程对象*/
  Thread td=new Thread(new Runnable(){
   public void run()
   {
    for(int i=0;i<5;i++)
    {
     System.out.println("匿名线程正在运行"+i);
    }
   }
  });
        td.start();
}
}

class  MyThread_synchronized implements Runnable
{     
public  void run()
{
   synchronized(new Object())//同步代码块
     {     
    for(int i=0;i<50;i++)
   {
    System.out.println("同步:MyThread_implements线程正在运行"+i);
   }
     }
}
}
结果:
同步:MyThread_implements线程正在运行0
匿名线程正在运行0
同步:MyThread_implements线程正在运行1
匿名线程正在运行1
匿名线程正在运行2
匿名线程正在运行3
匿名线程正在运行4
同步:MyThread_implements线程正在运行2
同步:MyThread_implements线程正在运行3
              ......
有点不懂: for(int i=0;i<50;i++){...}处在同步块中,为什么还会出现上面的运行结构啊????
           个人理解:
                 for(int i=0;i<50;i++)
   {
    System.out.println("同步:MyThread_implements线程正在运行"+i);
   }
           在同步块中,应该执行完后其它线程才运行的啊!
           求赐教!

作者: 郑彬    时间: 2012-8-27 14:57
在同步块中,应该执行完后其它线程才运行的啊!
这句话是错误的,这是2个线程,且这2个线程执行各自的的方法,并没有互相执行同一个方法。同步代码块的意思是不允许在一个线程还没执行完这个代码快的时候另一个线程进来执行这个代码块,并没有说不能执行其它方法,只是不能执行同步代码快的方法而已。
作者: 高廷平    时间: 2012-8-27 16:15
{:soso_e100:}有点理解了!
作者: 周兴华    时间: 2012-8-27 19:09
同步使用的前提:
1,必须是两个或者两个以上的线程。
2,必须是多个线程使用同一个锁。
这样才可以称为这些线程被同步了。


楼主只对一个线程写了sychronized代码块,没有满足前提中的第一条,因此不是同步线程。
作者: 广驰    时间: 2012-8-27 19:22
本帖最后由 应广驰 于 2012-8-27 19:24 编辑

你在代码中创建了两个线程,一个是MyThread_synchronized类的,还有一个是主程序中的匿名内部类的,并没有运行同一个,没有共享数据,synchronized加不加都一样
作者: 任文杰    时间: 2012-8-27 19:26
本帖最后由 RWJ2012 于 2012-8-27 19:28 编辑

要实现线程同步,首先要用同一个锁对象,下面是对这个程序的改进,符合楼主的要求,可以参考下。
package Demo_Test;

public class Demo_Thread {
        
        public static void main(String[] args) {
                final MyThread_synchronized myThread = new MyThread_synchronized();
                // 同步
                //new Thread(new MyThread_synchronized()).start();
                new Thread(myThread).start();

                /* 创建匿名线程对象 */
                Thread td = new Thread(new Runnable() {
                        public void run() {
                                synchronized (myThread) {//要实现同步也要用MyThread_synchronized的实例对象做为同步锁对象
                                        for (int i = 0; i < 5; i++) {
                                                System.out.println("匿名线程正在运行" + i);
                                        }
                                }
                        }
                });
                td.start();
        }
}

class MyThread_synchronized implements Runnable {
        public void run() {
                //synchronized (new Object());
                synchronized (this)//当前对象做为锁对象
                {
                        for (int i = 0; i < 50; i++) {
                                System.out.println("同步:MyThread_implements线程正在运行" + i);
                        }
                }
        }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2