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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© vipzh 中级黑马   /  2012-12-2 13:12  /  2263 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

run()和start()方法在线程中怎么区别,各自有什么用?

8 个回复

倒序浏览
自定义线程与要运行的任务都在run方法中,
start开启线程使其可以运行,并调用run方法
回复 使用道具 举报
start会启动一个新线程运行run中的代码,而run会在当前线程内执行。
start()方法是让当前线程处于就绪的状态,被调用后并不马上运行此线程。run()方法包含本线程需要做的事情,一般,调用start()方法后,jvm会自动调用run方法

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
java中thread的start()和run()的区别:

1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码:

通过调用Thread类的start()方法来启动一个线程,
这时此线程是处于就绪状态,
并没有运行。
然后通过此Thread类调用方法run()来完成其运行操作的,
这里方法run()称为线程体,
它包含了要执行的这个线程的内容,
Run方法运行结束,
此线程终止,
而CPU再运行其它线程,



2.run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码:

而如果直接用Run方法,
这只是调用一个方法而已,
程序中依然只有主线程--这一个线程,
其程序执行路径还是只有一条,
这样就没有达到写线程的目的。



举例说明一下:

记住:线程就是为了更好地利用CPU,
提高程序运行速率的!

public class TestThread1{
public static void main(String[] args){
Runner1 r=new Runner1();
//r.run();//这是方法调用,而不是开启一个线程
Thread t=new Thread(r);//调用了Thread(Runnable target)方法。且父类对象变量指向子类对象。
t.start();

for(int i=0;i<100;i++){
System.out.println("进入Main Thread运行状态");
System.out.println(i);
}
}
}
class Runner1 implements Runnable{ //实现了这个接口,jdk就知道这个类是一个线程
public void run(){

for(int i=0;i<100;i++){
System.out.println("进入Runner1运行状态");
System.out.println(i);
}
}
}

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
start() 方法启动线程 但是一个线程调用了start()并不表明线程马上执行,它需要等待CPU进程调度机制
run() 是表示线程的运行,是线程对象的一个方法,里面是具体的线程实现逻辑,所以 一个线程调用start() 只是启动了线程,或许在某一个等待队列中,并不表示线程运行,只有当调用run 的时候才表示线程的运行状态。这就是区别。
下面是举例说明

package cn.itcast.thread.piao;

public class Test {
        public static void main(String[] args) {
                PiaoKu pk = new PiaoKu(100);
                Thread th1 = new Thread(new ChuangKou(pk), "a");
                Thread th2 = new Thread(new ChuangKou(pk), "b");
                Thread th3 = new Thread(new ChuangKou(pk), "c");
                Thread th4 = new Thread(new ChuangKou(pk), "d");
                th1.start();
                th2.start();
                th3.start();
                th4.start();
        }
}

/*
* 窗口类
* 有一个票库属性
* 任务中循环出票
* 当发现票数小于等于0时,结束任务
*/
class ChuangKou implements Runnable {
        private PiaoKu pk;
       
        public ChuangKou(PiaoKu pk) {
                this.pk = pk;
        }
       
        /*
         * cnt = 1;
         * a: if(cnt <= 0) false
         * a: pk.chuPiao(); 0
         * a: 循环回来,int cnt = pk.getCount() = 0
         * a: 休眠
         * b: cnt = 1
         * b: cnt <= 0 false
         * b: pk.chuPiao() -1
         * b: 循环回来,int cnt = pk.getCount = -1
         * b: 休眠
         * c: ....
         * d: ....
         *
         */
        public void run() {
                while(true) {
                        synchronized(pk) {
                                int cnt = pk.getCount();
                                String name = Thread.currentThread().getName();
                                if(cnt <= 0) {
                                        break;
                                }
                                System.out.println(name + ": " + cnt);
                                pk.chuPiao();
                        }
                        try {
                                Thread.sleep(20);
                        } catch(InterruptedException e) {}
                }
        }
}

class PiaoKu {
        private int cnt;
       
        public PiaoKu(int cnt) {
                this.cnt = cnt;
        }
       
        // 返回当前票库的剩余票数
        public int getCount() {
                return cnt;
        }
       
        // 出票方法,就是把票数减减
        public void chuPiao() {
                this.cnt--;
        }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
复写Thread类中的run方法。
调用线程的start方法,该方法两个作用:启动线程,调用run方法。

class Demo extends Thread
{
        public void run()//覆盖方法
        {
                for(int i = 0; i < 60; i++)
                        System.out.println("demo run ----" + i);
        }
}

public class Summary {
        public static void main(String[] args)
        {
                Demo d = new Demo();//创建好一个线程
                d.start();//开启线程并执行该线程的run方法。
               
                for(int i = 0; i < 60; i++)
                {
                        System.out.println("Hello World|---" + i);
                }
        }
}
回复 使用道具 举报
刚复习了Java核心技术中关于多线程的知识,在Java核心技术中是这样描述run()和start()区别的:
一个线程Thread的start()方法会启动这个线程,将引发调用run()方法,这个方法将立即返回,并且新线程将并行运行。
在实际运用中,不要调用Thread类或者Runnable对象的run方法,直接调用run方法只会执行同一个线程中的任务,而不会启动新线程。我们应该调用Thread.start方法,这个方法将创建一个执行run方法的新线程。一旦调用了start方法,线程处于runnable状态,一个可运行的线程可能正在运行也可能没有运行,这取决于操作系统给线程提供的运行的时间。
下图是线程的状态图示,有助于更好的理解start和run的区别

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1

查看全部评分

回复 使用道具 举报
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);
            }
        }
    }
}

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1 赞一个!

查看全部评分

回复 使用道具 举报
焦健 高级黑马 2012-12-6 21:45:52
9#
在多线程程序中,写run()方法调用就是普通的函数调用,不会启动线程,使用start()方法调用可以启动线程和调用存储在run()方法中的多线程代码。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马