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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴通 中级黑马   /  2012-8-25 21:00  /  1632 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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一样而不是把任务分配给两个线程完成了?
求详解!

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
你这两个线程的代码都是run方法的内容,当然是打印两遍了
回复 使用道具 举报
两个线程都去运行同一个run方法,而x又是在for语句内有效的,是一个局部变量。两个线程调用它互补相关,当然是打印两遍了。如果将x定义到run方法外面就可能出现两个线程随机打印0到69了。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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();
                                }
                        }
看看这些。你就懂了,
回复 使用道具 举报
你的Demo类中的for循环中局部变量int x = 0被两个线程调用之后会都会执行一次,并不是共有的
把int x = 0,放到run外面就好了

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
总共是三个线程,两个线程和一个main的主线程,因为两个线程t1、t2使用的是同一个对象run方法,这个run方法中fo中有局部变量x,所以两个线程打印的是各自的局部变量x的值,而且是交替的打印各自的x值。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马