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);
- }
- }
- }
- }