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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘胜寒 金牌黑马   /  2013-4-26 21:29  /  1322 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘胜寒 于 2013-4-26 21:40 编辑
  1. public class Main extends Thread
  2. {


  3. private int a;
  4. public void start()
  5. {
  6. super.start();
  7. }
  8. public void run(){
  9. System.out.println("线程"+currentThread().getName()+"启动");
  10. for(a=0;a<40;a++){
  11. System.out.println(currentThread().getName()+":"+a);
  12. }
  13. }
  14. public static void main(String[] args) {
  15. Main m1 = new Main();
  16. m1.start();
  17. Main m2 = new Main();
  18. m2.start();
  19. for(int x=0;x<40;x++)
  20. {
  21. System.out.println("main线程:"+x);
  22. }
  23. }
  24. }
复制代码
这个块代码中复写了start方法,是去调用父类的start方法
下面是运行结果
线程Thread-0启动
main线程:0
main线程:1
Thread-0:0
main线程:2
线程Thread-1启动
main线程:3
Thread-0:1
main线程:4
Thread-1:0
main线程:5
main线程:6
main线程:7
main线程:8
main线程:9
main线程:10
main线程:11
main线程:12
Thread-0:2
Thread-0:3
main线程:13
main线程:14
main线程:15
Thread-1:1
main线程:16
Thread-0:4
main线程:17
main线程:18
main线程:19
main线程:20
main线程:21
main线程:22
main线程:23
main线程:24
main线程:25
main线程:26
main线程:27
main线程:28
main线程:29
main线程:30
main线程:31
main线程:32
main线程:33
main线程:34
main线程:35
main线程:36
main线程:37
main线程:38
main线程:39
Thread-1:2
Thread-0:5
Thread-0:6
Thread-0:7
Thread-0:8
Thread-0:9
Thread-0:10
Thread-0:11
Thread-0:12
Thread-0:13
Thread-0:14
Thread-0:15
Thread-0:16
Thread-0:17
Thread-0:18
Thread-0:19
Thread-1:3
Thread-0:20
Thread-1:4
Thread-1:5
Thread-0:21
Thread-1:6
Thread-0:22
Thread-1:7
Thread-1:8
Thread-0:23
Thread-1:9
Thread-0:24
Thread-1:10
Thread-0:25
Thread-0:26
Thread-1:11
Thread-0:27
Thread-1:12
Thread-0:28
Thread-0:29
Thread-0:30
Thread-1:13
Thread-0:31
Thread-0:32
Thread-0:33
Thread-0:34
Thread-0:35
Thread-1:14
Thread-0:36
Thread-1:15
Thread-0:37
Thread-0:38
Thread-1:16
Thread-0:39
Thread-1:17
Thread-1:18
Thread-1:19
Thread-1:20
Thread-1:21
Thread-1:22
Thread-1:23
Thread-1:24
Thread-1:25
Thread-1:26
Thread-1:27
Thread-1:28
Thread-1:29
Thread-1:30
Thread-1:31
Thread-1:32
Thread-1:33
Thread-1:34
Thread-1:35
Thread-1:36
Thread-1:37
Thread-1:38
Thread-1:39


这一段代码
  1. public class Main extends Thread
  2. {
  3. private int a;
  4. public void run(){
  5. System.out.println("线程"+currentThread().getName()+"启动");
  6. for(a=0;a<40;a++){
  7. System.out.println(currentThread().getName()+":"+a);
  8. }
  9. }
  10. public static void main(String[] args) {
  11. Main m1 = new Main();
  12. m1.start();
  13. Main m2 = new Main();
  14. m2.start();
  15. for(int x=0;x<40;x++)
  16. {
  17. System.out.println("main线程:"+x);
  18. }
  19. }
  20. }
复制代码
运行结果:
main线程:0
线程Thread-0启动
Thread-0:0
main线程:1
Thread-0:1
Thread-0:2
线程Thread-1启动
Thread-0:3
main线程:2
Thread-0:4
Thread-1:0
Thread-0:5
main线程:3
Thread-0:6
Thread-1:1
Thread-0:7
main线程:4
Thread-0:8
Thread-1:2
Thread-1:3
Thread-1:4
Thread-0:9
Thread-0:10
Thread-0:11
Thread-0:12
Thread-0:13
Thread-0:14
Thread-0:15
Thread-0:16
Thread-0:17
Thread-0:18
Thread-0:19
Thread-0:20
Thread-0:21
Thread-0:22
Thread-0:23
Thread-0:24
Thread-0:25
Thread-0:26
Thread-0:27
main线程:5
main线程:6
main线程:7
main线程:8
main线程:9
main线程:10
main线程:11
main线程:12
main线程:13
main线程:14
main线程:15
main线程:16
main线程:17
main线程:18
main线程:19
main线程:20
main线程:21
main线程:22
main线程:23
main线程:24
main线程:25
main线程:26
Thread-0:28
Thread-0:29
Thread-0:30
Thread-0:31
Thread-0:32
Thread-0:33
Thread-0:34
Thread-0:35
Thread-0:36
Thread-0:37
Thread-0:38
Thread-0:39
Thread-1:5
Thread-1:6
Thread-1:7
Thread-1:8
Thread-1:9
Thread-1:10
Thread-1:11
Thread-1:12
Thread-1:13
Thread-1:14
Thread-1:15
Thread-1:16
Thread-1:17
Thread-1:18
Thread-1:19
Thread-1:20
Thread-1:21
Thread-1:22
Thread-1:23
Thread-1:24
Thread-1:25
Thread-1:26
main线程:27
main线程:28
main线程:29
main线程:30
main线程:31
main线程:32
main线程:33
Thread-1:27
main线程:34
main线程:35
main线程:36
main线程:37
main线程:38
main线程:39
Thread-1:28
Thread-1:29
Thread-1:30
Thread-1:31
Thread-1:32
Thread-1:33
Thread-1:34
Thread-1:35
Thread-1:36
Thread-1:37
Thread-1:38
Thread-1:39

这两个结果没什么区别啊

谁能解释下Thread子类复写strat方法和Thread的start方法有什么区别吗

start()源码 我是没看懂
  1. public synchronized void start() {
  2.         /**
  3.          * This method is not invoked for the main method thread or "system"
  4.          * group threads created/set up by the VM. Any new functionality added
  5.          * to this method in the future may have to also be added to the VM.
  6.          *
  7.          * A zero status value corresponds to state "NEW".
  8.          */
  9.         if (threadStatus != 0)
  10.             throw new IllegalThreadStateException();

  11.         /* Notify the group that this thread is about to be started
  12.          * so that it can be added to the group's list of threads
  13.          * and the group's unstarted count can be decremented. */
  14.         group.add(this);

  15.         boolean started = false;
  16.         try {
  17.             start0();
  18.             started = true;
  19.         } finally {
  20.             try {
  21.                 if (!started) {
  22.                     group.threadStartFailed(this);
  23.                 }
  24.             } catch (Throwable ignore) {
  25.                 /* do nothing. If start0 threw a Throwable then
  26.                   it will be passed up the call stack */
  27.             }
  28.         }
  29.     }

  30.     private native void start0();

  31.     /**
  32.      * If this thread was constructed using a separate
  33.      * <code>Runnable</code> run object, then that
  34.      * <code>Runnable</code> object's <code>run</code> method is called;
  35.      * otherwise, this method does nothing and returns.
  36.      * <p>
  37.      * Subclasses of <code>Thread</code> should override this method.
  38.      *
  39.      * @see     #start()
  40.      * @see     #stop()
  41.      * @see     #Thread(ThreadGroup, Runnable, String)
  42.      */
  43.     @Override
  44.     public void run() {
  45.         if (target != null) {
  46.             target.run();
  47.         }
  48.     }
复制代码
原帖链接
多线程问题之重写start方法
http://bbs.itheima.com/thread-47650-1-1.html

5 个回复

倒序浏览
本帖最后由 袁梦希 于 2013-4-26 21:34 编辑

{:soso_e173:}整真么长    我得慢慢看


老刘啊   其实我觉得  他们用的都是Thread类中的start()方法。只是开启线程的方式不同,
回复 使用道具 举报
本帖最后由 java冬冬 于 2013-4-26 21:47 编辑

慢慢看{:soso_e152:}
额额额,好吧{:soso_e127:}
回复 使用道具 举报
寒妹。你把我们坑了。。。
回复 使用道具 举报
袁梦希 发表于 2013-4-26 21:32
整真么长    我得慢慢看

是我脑子不灵光了....
在不不写的情况下
子类调用的也是父类的....
复写只是显示的调用父类的start方法
去他妹的...
被贴子给误导了...
回复 使用道具 举报
我晕死,你那不叫复写!套了层外衣,调的还是父类的方法.
你那个源码不全.我们在run方法内写多线程执行的代码,用start启动线程,我记得老师说过的,线程调的是CPU的资源,java没有那个能力的.他在start方法内,封装的是调用本地API方法去开启多线程的代码.用native 声明的就说明是本平台的方法.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马