黑马程序员技术交流社区

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

作者: 李前进    时间: 2014-3-28 21:28
标题: 线程问题
Demo d=new Demo;
//d.start();
//d.run();

d.start()与d.run()有什么不同?
作者: 龙健    时间: 2014-3-28 21:42
在线程中,使用start启动线程,也就是说,你在启动线程的同时会自动的调用被覆盖的run方法,所以说不用你去调用run方法的,反而,如果你去掉用run方法,那么就是普通的调用了,虽然能也能运行run,但是是不会启动线程的,他只是主线程在执行run方法,也就是说你整个程序里面就只有一个主线程在执行
求技术分、、、、
作者: H-Deka    时间: 2014-3-28 21:44
线程的start()方法是启动线程,run()方法是线程启动后要执行的任务块
作者: 路西法    时间: 2014-3-28 21:49
你如果用run()其实程序并没有开启一个线程  只是调用了run()的方法   要开启一个新的线程必须用start()  同时也调用了run方法

作者: 宋超2356    时间: 2014-3-28 22:27
本帖最后由 宋超2356 于 2014-3-28 23:02 编辑
  1. public class Test {
  2.         public static void main(String args[]) {
  3.                 Runner r = new Runner();
  4.                 r.run();
  5.                 r.run();
  6.                 r.run();  //无论多少都不会报错,一个挨一个执行
  7.                 r.start();
  8.                 //r.start();//必然不可以
  9.                 }
  10.         }


  11. class Runner extends Thread {
  12.         public void run() {
  13.                 for(int i=0; i<100; i++) {        
  14.                         System.out.println("Runner1 :" + i);
  15.                 }
  16.         }
  17. }
复制代码


strat()只能调用一次
run()方法可调用多次
原因在于:start的调用创建了一个新的线程,分配时间片后开始执行run方法,而同一线程只能创建一个,所以只能调用一次
                 调用run知识调用方法,无新线程创建,所以可以多次调用


作者: 枫露    时间: 2014-3-28 22:37
1) start:
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
2) run:
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。

作者: ╰青青子佩ˊゝ    时间: 2014-3-28 22:45
d.start()有两个作用:①是启动一个线程;②是调用线程中的run方法。而d.run,只是调用了这个对象中的run方法,跟普通的调用对象没什么区别,没有开启线程,还是主线程执行代码。
作者: muma    时间: 2014-3-28 23:16
线程的start()方法是启动线程和复写父类中run函数,而run()方法只是复写父类中的run方法
作者: 北极雪871208    时间: 2014-3-29 07:17
Thread类中run()和start()方法的区别如下:
run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;
start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;

         


package com.ljq.test;

public class ThreadTest {
   
    /**
     * 观察直接调用run()和用start()启动一个线程的差别
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args){
        Thread thread=new ThreadDemo();
        //第一种
        //表明: run()和其他方法的调用没任何不同,main方法按顺序执行了它,并打印出最后一句
        //thread.run();
        
        //第二种
        //表明: start()方法重新创建了一个线程,在main方法执行结束后,由于start()方法创建的线程没有运行结束,
        //因此主线程未能退出,直到线程thread也执行完毕.这里要注意,默认创建的线程是用户线程(非守护线程)
        //thread.start();
        
        //第三种
        //1、为什么没有打印出100句呢?因为我们将thread线程设置为了daemon(守护)线程,程序中只有守护线程存在的时候,是可以退出的,所以只打印了七句便退出了
        //2、当java虚拟机中有守护线程在运行的时候,java虚拟机会关闭。当所有常规线程运行完毕以后,
        //守护线程不管运行到哪里,虚拟机都会退出运行。所以你的守护线程最好不要写一些会影响程序的业务逻辑。否则无法预料程序到底会出现什么问题
        //thread.setDaemon(true);
        //thread.start();
        
        //第四种
        //用户线程可以被System.exit(0)强制kill掉,所以也只打印出七句
        thread.start();
        System.out.println("main thread is over");
        System.exit(1);
    }
   
    public static class ThreadDemo extends Thread{
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println("This is a Thread test"+i);
            }
        }
    }
}





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