您的位置:首页 > 编程语言 > Java开发

Java中Thread类的start()和run()的区别

2013-12-13 15:17 453 查看
1、start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。 

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

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

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

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

为了更好地理解两者的区别,看以下的例子: 
例程1: 

Java代码  


public class TestThread {  

    public static void main(String arg[]){  

        NewThread t1 = new NewThread();  

        NewThread t2 = new NewThread();  

        Thread th1 = new Thread(t1);  

        Thread th2 = new Thread(t2);  

        System.out.println(Thread.currentThread().getName() );  

        th1.start();  

        th2.start();  

        //th1.run();  

        //th2.run();  

    }  

}  

class NewThread implements Runnable{  

    int i = 0;  

    public void run() {  

        for(int i = 0; i <20;i ++){  

            System.out.println(Thread.currentThread().getName() +"   "+ i);  

        }  

    }  

}  

程序的运行结果1(//th1.run();//th2.run();): 
main 

Thread-0   0 

Thread-0   1 

Thread-1   0 

Thread-0   2 

Thread-1   1 

Thread-1   2 

Thread-0   3 

Thread-1   3 

Thread-0   4 

Thread-1   4 

Thread-0   5 

Thread-0   6 

Thread-1   5 

Thread-0   7 

Thread-1   6 

Thread-0   8 

Thread-1   7 

Thread-0   9 

Thread-1   8 

Thread-0   10 

Thread-0   11 

Thread-0   12 

Thread-1   9 

Thread-0   13 

Thread-0   14 

Thread-1   10 

Thread-0   15 

Thread-0   16 

Thread-1   11 

Thread-0   17 

Thread-1   12 

Thread-0   18 

Thread-1   13 
Thread-0   19 

Thread-1   14 

Thread-1   15 

Thread-1   16 

Thread-1   17 

Thread-1   18 
Thread-1   19 
程序的运行结果2:(//th1.start();//th2.start();) 
main 

main   0 

main   1 

main   2 

main   3 

main   4 

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   0 

main   1 

main   2 

main   3 

main   4 

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 

运行结果分析:线程对象调用start()方法,就表示启动了线程,即又产生了一条执行线索。而调用run()方法,只是相当于普通的方法调用,并没有产生新的执行线索,run()方法仍然在调用它的线程中执行。 

如下图1为两种不同情况的比较: 



假设将程序中的注释都去掉: 
例程2: 

Java代码  


public class TestThread {  

    public static void main(String arg[]){  

        NewThread t1 = new NewThread();  

        NewThread t2 = new NewThread();  

        Thread th1 = new Thread(t1);  

        Thread th2 = new Thread(t2);  

        System.out.println(Thread.currentThread().getName());  

        th1.start();  

        th2.start();  

        th1.run();  

        th2.run();  

    }  

}  

class NewThread implements Runnable{  

    int i = 0;  

    public void run() {  

        for(int i = 0; i <20;i ++){  

            System.out.println(Thread.currentThread().getName() +"   "+ i);  

        }  

    }  

}  

程序的运行结果如下: 
第一种结果: 
main 

Thread-0   0 

Thread-1   0 

Thread-1   1 

Thread-1   2 

main   0 

Thread-1   3 

Thread-0   1 

Thread-1   4 

main   1 

main   2 

main   3 

main   4 

main   5 

Thread-1   5 

Thread-0   2 

Thread-0   3 

Thread-0   4 

Thread-0   5 

Thread-0   6 

Thread-0   7 

Thread-1   6 

Thread-1   7 

main   6 

Thread-1   8 

Thread-0   8 

Thread-0   9 

Thread-1   9 

main   7 

Thread-1   10 

Thread-0   10 

Thread-1   11 

main   8 

main   9 

Thread-1   12 

Thread-0   11 

Thread-1   13 

Thread-1   14 

Thread-1   15 

main   10 

Thread-1   16 

Thread-1   17 

Thread-0   12 

Thread-1   18 

main   11 

Thread-1   19 

Thread-0   13 

Thread-0   14 

main   12 

main   13 

main   14 

Thread-0   15 

main   15 

Thread-0   16 

main   16 

main   17 

Thread-0   17 

main   18 

Thread-0   18 
main   19 

Thread-0   19 
第二种结果: 
main 

main   0 

Thread-0   0 

Thread-1   0 

Thread-0   1 

main   1 

main   2 

Thread-0   2 

Thread-1   1 

Thread-0   3 

main   3 

main   4 

Thread-0   4 

Thread-0   5 

Thread-0   6 

Thread-0   7 

Thread-1   2 

Thread-0   8 

main   5 

Thread-0   9 

Thread-1   3 

Thread-0   10 

main   6 

Thread-0   11 

Thread-1   4 

Thread-0   12 

main   7 

Thread-0   13 

Thread-1   5 

Thread-0   14 

main   8 

Thread-0   15 

Thread-1   6 

Thread-0   16 

main   9 

Thread-0   17 

Thread-1   7 

Thread-0   18 

main   10 

Thread-0   19 

Thread-1   8 

main   11 

Thread-1   9 

main   12 

Thread-1   10 

Thread-1   11 

main   13 

Thread-1   12 

Thread-1   13 

Thread-1   14 

main   14 

Thread-1   15 

main   15 

Thread-1   16 

main   16 

main   17 

Thread-1   17 

main   18 

Thread-1   18 
main   19 

Thread-1   19 

main   0 

main   1 

main   2 

main   3 

main   4 

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 
问题:为什么会产生这两种结果? 

例程3: 

Java代码  


public class TestThread {  

    public static void main(String arg[]){  

        NewThread t1 = new NewThread();  

        NewThread t2 = new NewThread();  

        Thread th1 = new Thread(t1);  

        Thread th2 = new Thread(t2);  

            th1.start();  

        th2.start();  

        for(int i = 0; i <20;i ++){  

            System.out.println(Thread.currentThread().getName() +"   "+ i);  

        }  

        th1.run();  

        th2.run();  

    }  

}  

class NewThread implements Runnable{  

    int i = 0;  

    public void run() {  

        for(int i = 0; i <20;i ++){  

            System.out.println(Thread.currentThread().getName() +"   "+ i);  

        }  

    }  

}  

程序的运行结果如下: 
第一种结果: 
main   0 

main   1 

Thread-0   0 

Thread-1   0 

Thread-1   1 

Thread-0   1 

Thread-0   2 

main   2 

Thread-0   3 

Thread-1   2 

Thread-0   4 

Thread-0   5 

main   3 

Thread-0   6 

Thread-1   3 

Thread-0   7 

main   4 

main   5 

Thread-0   8 

Thread-0   9 

Thread-1   4 

Thread-1   5 

Thread-1   6 

Thread-0   10 

main   6 

Thread-0   11 

Thread-1   7 

Thread-0   12 

Thread-0   13 

Thread-0   14 

main   7 

main   8 

main   9 

main   10 

Thread-0   15 

Thread-0   16 

Thread-1   8 

Thread-0   17 

main   11 

Thread-0   18 

Thread-1   9 

Thread-1   10 

Thread-1   11 

Thread-0   19 

main   12 

main   13 

main   14 

Thread-1   12 

main   15 

Thread-1   13 

main   16 

Thread-1   14 

main   17 

Thread-1   15 

main   18 
main   19 

Thread-1   16 

main   0 

Thread-1   17 

main   1 

Thread-1   18 

Thread-1   19 

main   2 

main   3 

main   4 

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 
第二种结果: 
Thread-0   0 

Thread-1   0 

Thread-1   1 

Thread-1   2 

main   0 

Thread-1   3 

Thread-0   1 

Thread-0   2 

Thread-1   4 

main   1 

Thread-1   5 

Thread-1   6 

Thread-1   7 

Thread-0   3 

Thread-1   8 

Thread-1   9 

main   2 

Thread-1   10 

Thread-0   4 

Thread-1   11 

Thread-1   12 

main   3 

main   4 

Thread-1   13 

Thread-0   5 

Thread-1   14 

main   5 

Thread-1   15 

Thread-0   6 

Thread-0   7 

Thread-0   8 

Thread-0   9 

Thread-1   16 

main   6 

Thread-1   17 

Thread-0   10 

Thread-0   11 

Thread-1   18 

Thread-1   19 

main   7 

main   8 

main   9 

Thread-0   12 

Thread-0   13 

main   10 

Thread-0   14 

Thread-0   15 

Thread-0   16 

main   11 

Thread-0   17 

main   12 

Thread-0   18 

main   13 

Thread-0   19 

main   14 

main   15 

main   16 

main   17 

main   18 
main   19 
第三种结果: 
main   0 

main   1 

main   2 

main   3 

main   4 

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 

Thread-1   0 

Thread-0   0 

Thread-1   1 

main   0 

main   1 

Thread-0   1 

main   2 

Thread-1   2 

Thread-1   3 

Thread-1   4 

main   3 

main   4 

Thread-0   2 

main   5 

Thread-1   5 

main   6 

Thread-0   3 

main   7 

Thread-1   6 

main   8 

Thread-0   4 

Thread-0   5 

main   9 

main   10 

main   11 

Thread-1   7 

main   12 

main   13 

main   14 

Thread-0   6 

main   15 

Thread-1   8 

main   16 

Thread-0   7 

main   17 

Thread-1   9 

main   18 
main   19 

Thread-0   8 

Thread-0   9 

main   0 

Thread-1   10 

main   1 

main   2 

Thread-0   10 

Thread-0   11 

Thread-0   12 

main   3 

Thread-1   11 

Thread-1   12 

Thread-1   13 

main   4 

Thread-0   13 

main   5 

Thread-1   14 

main   6 

Thread-0   14 

main   7 

Thread-1   15 

main   8 

main   9 

main   10 

Thread-0   15 

Thread-0   16 

main   11 

Thread-1   16 

main   12 

Thread-0   17 

main   13 

Thread-1   17 

main   14 

Thread-0   18 

main   15 

Thread-1   18 

Thread-1   19 

main   16 

Thread-0   19 

main   17 

main   18 
main   19 
问题:为什么会产生这三种结果? 

例程4: 

Java代码  


public class TestThread {  

    public static void main(String arg[]){  

        NewThread t1 = new NewThread();  

        NewThread t2 = new NewThread();  

        Thread th1 = new Thread(t1);  

        Thread th2 = new Thread(t2);  

        for(int i = 0; i <20;i ++){  

            System.out.println(Thread.currentThread().getName() +"   "+ i);  

        }  

        th1.run();  

        th2.run();  

    }  

}  

class NewThread implements Runnable{  

    int i = 0;  

    public void run() {  

        for(int i = 0; i <20;i ++){  

            System.out.println(Thread.currentThread().getName() +"   "+ i);  

        }  

    }  

}  

程序运行结果如下: 
main   0 

main   1 

main   2 

main   3 

main   4 

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   0 

main   1 

main   2 

main   3 

main   4 

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   0 

main   1 

main   2 

main   3 

main   4 

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 
说明:在这种情况下才会产生惟一结果。线程对象直接调用run()方法,在主线程中顺序执行。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: