1. java線程中run和start方法的區別
區別:調用start方法實現多線程,而調用run方法沒有實現多線程
Start:
用start方法來啟動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。通過調用Thread類的start()方法來啟動一個線程,這時此線程處於就緒(可運行)狀態,並沒有運行,一旦得到spu時間片,就開始執行run()方法,這里方法run()稱為線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程隨即終止。
Run:
run()方法只是類的一個普通方法而已,如果直接調用Run方法,程序中依然只有主線程這一個線程,其程序執行路徑還是只有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的代碼,這樣就沒有達到寫線程的目的。
總結:調用start方法方可啟動線程,而run方法只是thread的一個普通方法調用,還是在主線程里執行。
2. java中線程的run()方法
當一個線程調用它的start()方法後,虛擬機就會去調用這個線程中的run()方法。
如myThread是一個線程對象,調用myThread.start();後,當CPU輪到這個線程使用時,虛擬機就會去調用這個線程的run()方法。
3. java線程中的run方法什麼時候調用
調用start()時開啟線程,當該線程獲取執行資源後就開始執行run方法;就是多線程會競爭資源,誰獲得資源誰就執行,就是運行run方法
4. Java中線程的start方法和run方法的區別
1 start():標志著線程開始運行
2 sleep():來自Thread 類 ,會讓程序進入睡眠狀態,在一定時間後自動運行,不會釋放鎖當時且需要捕獲異常,是靜態方法
3 wait():來自Object類,,會讓程序進入等待狀態,只有通過notiy()或notifAllj()方法才能將它喚醒,會釋放鎖且不需要捕獲異常
4 join():在一個線程中調用另一個線程的join(),則當前線程阻塞,讓另一個線程先執行後,當前才執行.
4 yield():
5. JAVA中run()問題
調用的是同一個run方法,但是在Thread中,會新建一個線程執行這段代碼,不會影響當前線程的工作。否則run執行起來,當前的進程就阻塞勒。
6. Java線程中run和start方法的區別
通過調用一個線程類的run方法是相當於直接調用run方法,不會單獨啟動一個線程,此時,run方法只相當於一個普通類當中的一個普通方法,run中實現的演算法依然會放入主線程去執行;而調用start方法是啟動線程的標准方法,調用start以後就會啟動一個獨立的線程,該線程的任務就是執行run中的所有邏輯,邏輯執行完成,線程結束。
JAVA多線程是JAVA編程語言的一大特性;自定義一個多線程可以繼承Thread類或者實現Runnable介面實現,但是都需要重寫run方法,也就是說以後線程啟動以後,run方法內部的邏輯會以一個獨立的線程的方式被運行,因此就形成了並發編程的說法。
多線程解釋:五人天的工作量,原來一個人需要五天才能完成,現在一個線程就相當於一個人,五個人的工作量就可以在一天內完成,因此在計算機編程中遇到此類場景需要優化性能時,都可以考慮通過多線程的方式來解決。
7. java 線程 我想讓沒執行完的run方法 提前終止。有什麼方法
java線程讓沒執行完的run方法提前終止的方法如下:
1. 使用退出標志,使線程正常退出,也就是當run方法完成後線程終止。
packagechapter2;
{
publicvolatilebooleanexit=false;
publicvoidrun()
{
while(!exit);
}
publicstaticvoidmain(String[]args)throwsException
{
ThreadFlagthread=newThreadFlag();
thread.start();
sleep(5000);//主線程延遲5秒
thread.exit=true;//終止線程thread
thread.join();
System.out.println("線程退出!");
}
}
2. 使用stop方法強行終止線程(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發生不可預料的結果)。
3. 使用interrupt方法中斷線程。
當run方法執行完後,線程就會退出。但有時run方法是永遠不會結束的。如在服務端程序中使用線程進行監聽客戶端請求,或是其他的需要循環處理的任務。在這種情況下,一般是將這些任務放在一個循環中,如while循環。如果想讓循環永遠運行下去,可以使用while(true){……}來處理。但要想使while循環在某一特定條件下退出,最直接的方法就是設一個boolean類型的標志,並通過設置這個標志為true或false來控制while循環是否退出。下面給出了一個利用退出標志終止線程的例子。 在上面代碼中定義了一個退出標志exit,當exit為true時,while循環退出,exit的默認值為false.在定義exit時,使用了一個Java關鍵字volatile,這個關鍵字的目的是使exit同步,也就是說在同一時刻只能由一個線程來修改exit的值,
8. Java中線程Thread有沒有帶參數的run方法呀
沒有,線程中沒有帶參數的run方法。
如果想要實現帶參數的run方法:
1、定義線程內變數
2、在繼承thread的時候,增加帶參數的構造函數,初始化線程內變數
3、在run方法操作線程內變數,以達到類似傳參的效果。
示例:
classMyThreadextendsThread{
inta=0;//定義線程內變數
publicMyThread(inta){//定義帶參數的構造函數,達到初始化線程內變數的值
this.a=a;
}
@Override
publicvoidrun(){
this.a++;//線程內變數自增
}
}
9. java線程怎麼run方法內添加方法
run()方法:在本線程內調用該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);
}
}
}
}