『壹』 java中有幾種方法可以實現一個線程
java中實岩斗蠢現一個線程的方法:
基本的是兩種:
第一種是繼承Tread class:
class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { //銷埋 compute primes larger than minPrime . . . } }
在main里:
PrimeThread p = new PrimeThread(143); p.start();
還有就一種是implements Runnable:
public class HelloRunnable implements Runnable { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new Thread(new HelloRunnable())).start(); }}
同樣用 xxx.start() 可以運行這個線程
這是基本的,還有就是管理一群粗陪線程(threads pool),可以用executor以及executor service, 以上信息都可以在oracle網找到很多例子
『貳』 java啟用另外一個線程設置無超時狀態
Java的線程是不允許啟動兩次的,第二次調用必然會拋出IllegalThreadStateException,這是一種運行時異常,多次調用start被認為是編程錯誤。
關於線程生命周期的不同狀態,在Java 5以後,線程狀態被明確定義在其公共內部枚舉類型java.lang.Thread.State中,分別是:
新建(NEW),表示線程被創建出來還沒真正啟動的狀態,可以認為它是個Java內部狀態。
就緒(RUNNABLE),表示該線程已經在JVM中執行,當然由於執行需要計算資源,它可能是正在運行,也可能還在等待系統分配給它CPU片段,在就緒隊列裡面排隊。 在其他一些分析中,會額外區分一種狀態鏈弊RUNNING,但是從Java API的角度,並不能表示出來。
阻塞(BLOCKED),這個狀態和我們前面兩講介紹的同步非常相關,阻塞表示線程在等待Monitor lock。比如,線程試圖通過synchronized去獲取某個鎖,但是其他線程已經獨佔了,那麼當前線程就會處於阻塞狀態。
等待(WAITING),表示正在等待其他線程採取某些操作。一個常見的場景是類似生產者消費者模式,發現任務條件尚未滿足,就讓當前消費者線程等待(wait),另外的生產者線程去准備任務數據,然後通過類似notify等動作,通知消費線程可以繼續工作了。Thread.join()也會令線程進入等待狀態。
計時等待(TIMED_WAIT),其進入條件和等待狀態類似,但是調用的是存在超時條件的方法,比如wait或join等方法的指定超時版本,如下面示例:
public final native void wait(long timeout) throws InterruptedException;
終止(TERMINATED),不管是意外退出還是正常執行結束,線程已經完成使命,終止運行,也有人把這個狀態叫作死亡。
在第二次調用start()方法的時候,線程可能處於終止或者其他(非NEW)狀態,但是不論如何,都是不可凱絕以再次啟動的。
考點分析
今天的問題可以算是個常見的面試熱身題目,前面的給出的典型回答,算是對基本狀態和簡單流轉的一個介紹,如果覺得還不夠直觀,我在下面分析會對比一個狀態圖進行介紹。總的來說,理解線程對於我們日常開發或者診斷分析,都是不可或缺的基礎。
面試棚孫族官可能會以此為契機,從各種不同角度考察你對線程的掌握:
相對理論一些的面試官可以會問你線程到底是什麼以及Java底層實現方式。
線程狀態的切換,以及和鎖等並發工具類的互動。
線程編程時容易踩的坑與建議等。
可以看出,僅僅是一個線程,就有非常多的內容需要掌握。我們選擇重點內容,開始進入詳細分析。
知識擴展
首先,我們來整體看一下線程是什麼?
從操作系統的角度,可以簡單認為,線程是系統調度的最小單元,一個進程可以包含多個線程,作為任務的真正運作者,有自己的棧(Stack)、寄存器(Register)、本地存儲(Thread Local)等,但是會和進程內其他線程共享文件描述符、虛擬地址空間等。
在具體實現中,線程還分為內核線程、用戶線程,Java的線程實現其實是與虛擬機相關的。對於我們最熟悉的Sun/Oracle JDK,其線程也經歷了一個演進過程,基本上在Java 1.2之後,JDK已經拋棄了所謂的Green Thread,也就是用戶調度的線程,現在的模型是一對一映射到操作系統內核線程。
如果我們來看Thread的源碼,你會發現其基本操作邏輯大都是以JNI形式調用的本地代碼。
『叄』 java—for循環里啟動的線程要怎麼理解
首先類繼承Thread或者實現了Runnable介面,程序就知道這是一個線程類,每次new 一個線程類,相當於創建了一個新的線程對象,使用start是啟動一個線程,線程處於就緒狀態,而run方法屬於線程體;
如此在循環體中循環了20次,創建了20個不同的線程,每次都使用了start方法,也就是啟動了20個不同的線程;
左上角有我頭像,歡迎來學習交流;
『肆』 舉例說明java中的runnable 介面實現線程,並啟動線程的方法.
publicclassRunnableDemo{
publicstaticvoidmain(String[]args)throwsException{
longstatTime=System.currentTimeMillis();
SimpleRunnablerunnable1=newSimpleRunnable();
SimpleRunnablerunnable2=newSimpleRunnable();
//每個Thread(線程)可以接受一個Runnable的實現類做參數
//線程啟動時會去運行你實現的run()方法
Threadthread1=newThread(runnable1);
Threadthread2=newThread(runnable2);
thread1.start();//啟動線程1
thread2.start();//啟動線程2
thread1.join();//等待線程1運行結束
thread2.join();//等待線程2運行結束
longendTime=System.currentTimeMillis();
doubletime=(endTime-statTime)/1000.0;
System.out.println("程序運行時間:"+time+"秒");
//每個任務運行時間都應該是2秒,但是因為你每個任務都用了一個線程去運行
//所以這兩個線程是同時(並發)進行的,所以這個程序只需要2秒左右就可以結束
}
}
//寫一個實現Runnable介面的類,並實現run()方法
{
@Override
publicvoidrun(){
runTask();//運行你的任務
}
privatevoidrunTask(){
try{
Thread.sleep(2000);//假設你的任務需要兩秒完成
}catch(InterruptedExceptionex){
ex.printStackTrace(System.err);
}
}
}
『伍』 在java中啟動線程使用run()還是start()
啟動一個線程用start()方法,使線程所代表的虛擬處理機處於可運行的狀態,這意味著它可以有JVM(java虛擬機)來調度和執行,這並不意味著線程就會立即執行。run()方法可以產生必須退出的標志來停止一個線程。
『陸』 java怎麼創建一個線程
Java線程類也是一個object類,它的實例都繼承自java.lang.Thread或其子類。可以用如下方式用java中創建一個線程:
Treadthread=newThread();
執行該線程可以調用該線程的start()方法:
thread.start();
編寫線程運行時執行的代碼有兩種方式:一種是創建Thread子類的一個實例並重寫run方法,第二種是創建類的時候實現Runnable介面。接下來我們會具體講解這兩種方法:
創建Thread的子類
創建Thread子類的一個實例並重寫run方法,run方法會在調用start()方法之後被執行。例子如下:
{
publicvoidrun(){
System.out.println("MyThreadrunning");
}
}
可以用如下方式創建並運行上述Thread子類
MyThreadmyThread=newMyThread();
myTread.start();
一旦線程啟動後start方法就會立即返回,而不會等待到run方法執行完畢才返回。就好像run方法是在另外一個cpu上執行一樣。當run方法執行後,將會列印出字元串MyThread running。
實現Runnable介面
第二種編寫線程執行代碼的方式是新建一個實現了java.lang.Runnable介面的類的實例,實例中的方法可以被線程調用。下面給出例子:
{
publicvoidrun(){
System.out.println("MyRunnablerunning");
}
}
為了使線程能夠執行run()方法,需要在Thread類的構造函數中傳入MyRunnable的實例對象。示例如下:
Threadthread=newThread(newMyRunnable());
thread.start();
當線程運行時,它將會調用實現了Runnable介面的run方法。上例中將會列印出」MyRunnable running」。
『柒』 JAVA中如何控制線程的啟動與暫停
線程的狀態表示線程正在進行的活動以及在此時間段內所能完成的任務.線程有創建,可運行,運行中,阻塞,死亡五中狀態.一個具有生命的線程,總是處於這五種狀態之一:
1.創建狀態
使用new運算符創建一個線程後,該線程僅僅是一個空對象,系統沒有分配資源,稱該線程處於創建狀態(new thread)
2.可運行狀態
使用start()方法啟動一個線程後,系統為該線程分配了除CPU外的所需資源,使該線程處於可運行狀態(Runnable)
3.運行中狀態
Java運行系統通過調度選中一個Runnable的線程,使其佔有CPU並轉為運行中狀態(Running).此時,系統真正執行線程的run()方法.
4.阻塞狀態
一個正在運行的線程因某種原因不能繼續運行時,進入阻塞狀態(Blocked)
5.死亡狀態
線程結束後是死亡狀態(Dead)
創建線程和啟動線程並不相同,在一個線族殲洞程對新線程的Thread對象調用start()方法之前,這個新線程並沒有真正開始執行。Thread對象在其線程真正啟動之前就已經存在了,而且其線程退出之後仍然存在。這可以讓您控制或獲取關於已創建的線程的信息,即使線程還沒有啟動或已經完成了。
通常在構造器中通過start()啟動線程並不是好主意。這樣做,會把部分構造的對象暴露給新改慶的線程。如果對象擁有一個線程,那麼它應該提供一個啟動該線程的start()或init()方法,而不是從構造器中啟動它。
結束Java線程
Java線程會以以下三種方式之一結束:
Java線程到達其run()方法的末尾。
Java線程拋出一個未捕獲到的Exception或Error。
另一個Java線程調用一個棄用的stop()方法。棄用是指這些方法仍然存在,但是您不應該兆枯在新代碼中使用它們,並且應該盡量從現有代碼中除去它們。
當Java程序中的所有線程都完成時,程序就退出了。
『捌』 java怎麼在需要的地方啟動內部類線程
new 這個類得到實例obj,然後 obj.start()
不過你這個程序寫的問題比較多。
首先密碼你直接比較基本上是大忌, 一般都是比校驗碼。
而且你button直接實現一個runnable不就完了,何必寫一個thread類。
『玖』 java中有幾種方法可以實現一個線程
4種。
1、匿哪滾升名內部類形式。例備改:
Thread t = new Thread(new Runnable(){
//代碼
});
t.start();
2、該類實現Runnablef介面。例子:
public class MyThread implements Runnable{
Thread t = new Thread(this);
t.start();
public void run(){ //啟動線程自動調用此方法
}
}
3、其他類實現Runnable介面。例子:
public class MainThread{
Thread thread = new Thread(new GetThread());
thread.start();
}
class GetThread implements Runnable{
public void run(){ //啟動線程自動調用此方法
}
}
4、內部類實現Runnable介面。例子:
public class ManClass{
Thread t = new Thread(new RunnableClass());
t.start();
class RunnableClass implements Runnable{
public void run(){ //啟動線程自動調用此李老方法
}
}
}
原創,望採納,謝謝。
『拾』 java中有幾種方法可以實現一個線程用什麼關鍵字修飾同步方法
無論何種方式,啟動一個線程,就要給它一個名字!這對和明排錯診斷系統監控豎缺有幫助。否則診斷問題時,無法直觀知喚纖告道某個線程的用途。