黑马程序员技术交流社区

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

作者: 吴通    时间: 2012-8-25 21:00
标题: 多线程问题
class Demo implements Runnable
{
public void run()
{
  for(int x=0;x<70;x++)
  {
   System.out.println(Thread.currentThread().getName()+"......"+x);
   //Thread.yield();   //交替
  }
}
}
class JoinDemo
{
public static void main(String[] args)
{
  Demo d=new Demo();
  Thread t1=new Thread(d);
  Thread t2=new Thread(d);
  t1.start();
  t2.start();
  System.out.println("Hello World!");
}
}



这个是两个线程操作Demo里面的run,我觉得应该是两个线程共同把0~69这些数字
打印下来,为什么会打印两遍呢?
如果是这样的话那不就是和新建两个Demo一样而不是把任务分配给两个线程完成了?
求详解!

作者: 杨震    时间: 2012-8-25 21:03
你这两个线程的代码都是run方法的内容,当然是打印两遍了
作者: 唐见    时间: 2012-8-25 21:12
两个线程都去运行同一个run方法,而x又是在for语句内有效的,是一个局部变量。两个线程调用它互补相关,当然是打印两遍了。如果将x定义到run方法外面就可能出现两个线程随机打印0到69了。
作者: 杨习平    时间: 2012-8-25 21:25
1:多线程
        (1)多线程
                A:进程:正在运行的程序,代表的是应用程序在内存中的执行区域。
                B:线程:线程是进行的执行单元,执行路径。
                C:任何一个应用程序,都至少有一条执行路径。
                D:单线程程序:应用程序只有一条执行路径。
                E:多线程程序:应用程序有多条执行路径。
               
                举例:360图形用户管理界面,迅雷下载,请人吃饭...
        (2)jvm启动的时候,是单线程的还是多线程的?
                是多线程的。
                假如jvm的启动时单线程的,那么,在程序的运行过程中,就可能存在着
                内存溢出的隐患。不可能等到内存溢出了,在去进行垃圾回收。所以,jvm
                启动是多线程的。至少有两个,主线程和垃圾回收线程。
        (3)java中实现多线程的方式
                A:继承Thread类
                        步骤:
                        **自定义类继承Thread类
                        **重写run方法
                        **创建自定义类的对象
                        **调用start方法
                       
                        代码体现:
                       
                        public class ThreadDemo extends Thread
                        {
                                public void run()
                                {
                                        //code
                                }
                        }

                        public class ThreadDemoTest
                        {
                                public static void main(String[] args)
                                {
                                        ThreadDemo td1 = new ThreadDemo();       
                                        ThreadDemo td2 = new ThreadDemo();

                                        td1.start();
                                        td2.start();
                                }
                        }

                B:实现Runnable接口
                        步骤:
                        **创建自定义类实现Runnable接口
                        **在自定义类中实现Runnable接口中的run方法
                        **创建自定义类对象,并把该对象作为参数传递给
                          Thread类的构造方法来创建Thread的对象
                        **调用start方法
                       
                        代码体现:

                        public class RunnableDemo implements Runnable
                        {
                                public void run()
                                {
                                        //code
                                }
                        }

                        public class RunnableDemoTest
                        {
                                public static void main(String[] args)
                                {
                                        RunnableDemo rd = new RunnableDemo();

                                        Thread t1 = new Thread(rd);
                                        Thread t2 = new Thread(rd);

                                        t1.start();
                                        t2.start();
                                }
                        }
看看这些。你就懂了,
作者: 广驰    时间: 2012-8-25 21:28
你的Demo类中的for循环中局部变量int x = 0被两个线程调用之后会都会执行一次,并不是共有的
把int x = 0,放到run外面就好了
作者: 杨卫腾    时间: 2012-8-26 11:01
总共是三个线程,两个线程和一个main的主线程,因为两个线程t1、t2使用的是同一个对象run方法,这个run方法中fo中有局部变量x,所以两个线程打印的是各自的局部变量x的值,而且是交替的打印各自的x值。




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