threadjava線程
① javaThread線程的狀態有哪些
[1]新生狀態(New):當一個線程的實例被創建即使用new關鍵字和Thread類或其子類創建一個線程對象後,此時該線程處於新生(new)狀態,處於新生狀態的線程有自己的內存空間,但該線程並沒有運行,此時線程還不是活著的(notalive)。
[2]就緒狀態(Runnable):通過調用線程實例的start()方法來啟動線程使線程進入就緒狀態(runnable);處於就緒狀態的線程已經具備了運行條件,但還沒有被分配到CPU即不一定會被立即執行,此時處於線程就緒隊列,等待系統為其分配CPCU,等待狀態並不是執行狀態;此時線程是活著的(alive)。
[3]運行狀態(Running):一旦獲取CPU(被JVM選中),線程就進入運行(running)狀態,線程的run()方法才開始被執行;在運行狀態的線程執行自己的run()方法中的操作,直到調用其他的方法而終止、或者等待某種資源而阻塞、或者完成任務而死亡;如果在給定的時間片內沒有執行結束,就會被系統給換下來回到線程的等待狀態;此時線程是活著的(alive)。
[4]阻塞狀態(Blocked):通過調用join()、sleep()、wait()或者資源被暫用使線程處於阻塞(blocked)狀態;處於Blocking狀態的線程仍然是活著的(alive)。
[5]死亡狀態(Dead):當一個線程的run()方法運行完畢或被中斷或被異常退出,該線程到達死亡(dead)狀態。此時可能仍然存在一個該Thread的實例對象,當該Thread已經不可能在被作為一個可被獨立執行的線程對待了,線程的獨立的callstack已經被dissolved。一旦某一線程進入Dead狀態,他就再也不能進入一個獨立線程的生命周期了。對於一個處於Dead狀態的線程調用start()方法,會出現一個運行期(runtimeexception)的異常;處於Dead狀態的線程不是活著的(notalive)。
② java線程Thread和Runnable的區別
Runnable介面和Thread類是java中實現多線程的兩中方法。
Thread類的構造方法有8個,但常用的只有4個,分別為:
Thread類中的兩個最主要的方法:
(1)run()—包含線程運行時所執行的代碼,即線程需要完成的任務,是線程執行體。
(2)start()—用於啟動線程。
實現Runnable介面的類必須使用Thread類的實例才能創建線程。通過實現Runnable介面來創建並啟動多線程的步驟:
③ java中Thread.sleep 這個Thread到底是主線程還是子線程啊
程忙著拷貝文件
就需要一個響應進程
響應用戶按取消按鈕的動作
④ java線程只能被啟動(Thread.start())一次,那麼為什麼線程池中的線程能被重復利用呢
因為線程池並不是重復利用一個線程實例,而是在池內每執行一個任務都用new Thread()得到一個新的線程實例。然後用再啟動。
⑤ Java線程怎樣使用
多進程是指操作系統能同時運行多個任務(程序),多線程是指在同一程序中有多個順序流在執行。
在java中創建一個線程有兩種方法:
packagecom.thread;
publicclassThreadTest1{
publicstaticvoidmain(String[]args){
Runnable1r=newRunnable1();
//r.run();並不是線程開啟,而是簡單的方法調用
Threadt=newThread(r);//創建線程
//t.run();//如果該線程是使用獨立的Runnable運行對象構造的,則調用該Runnable對象的run方法;否則,該方法不執行任何操作並返回。
t.start();//線程開啟
for(inti=0;i<100;i++){
System.out.println("main:"+i);
}
}
}
{
publicvoidrun(){
for(inti=0;i<100;i++){
System.out.println("Thread-----:"+i);
}
}
}
⑥ Java線程 Java線程
Java Thread sleep示例
這里是一個簡單的程序,它使用Thread.sleep()暫停主線程2分鍾。
[java] view plain
package com.journaldev.threads;
public class ThreadSleep {
public static void main(String[] args) throws InterruptedException {
long start = System.currentTimeMillis();
Thread.sleep(2000);
System.out.println("Sleep time in ms = "+(System.currentTimeMillis()-start));
}
}
如果你將執行上面的程序,你將注意到線程休眠列印時間略微大於2000毫秒,導致線程這樣執行的原因是操作系統具體實現和線程調度引起的。
Java線程休眠要點:
1.它總是暫停當前執行的線程
2.實際休眠的線程在喚醒開始執行前依賴於系統定時器和調度器,對於一個平穩的系統來住,線程實際執行的時間接近於指定線程休眠時間,但是對於一個忙碌的系統來說它將稍微超出一些。
3.當線程休眠時不會丟失已經獲得的監控和鎖。
4.任何線程都能中斷當前休眠的線程,將導致InterruptedException異常拋出。
線程休眠是如何工作的:
Thread.sleep()與線程調度器交互,在指定的時間內將當前線程作為等待狀態放入,一旦等待時間結束後,線程狀態變為可運行狀態,並等待CPU進一步執行。所以當前線程的實際休眠時間依賴於線程調度器和一部門操作系統。
⑦ JavaThread的線程概述是什麼
線程是一個程序的多個執行路徑,執行調度的單元,依託於進程的存在。線不僅可以共享進程的內在,而且還擁有一個屬於自己的內存空間,這段內存空間就是線程棧,是在建立線程時系統分配的,主要用來保存線內部所使用的數據,如線程執行函數中所定義的變數,線程的狀態等信息。
Java中的多線程是一個搶占機制,搶占機制指的是多個線程處於可運行狀態,但只是允許一個線程運行,他們通過競爭方式搶佔CPU。
⑧ java中Thread線程問題
線程有兩種,一種是繼承Thread的
另一種是使用Runnable介面的
兩種區別是Runnable內的成員變數回是共享的
你將extends Thread 改成implements Runnable
或者答將ticket改為public static 就不會出現負數的效果
⑨ Java中如何用Thread類實現多線程
定義類實現Thread或實現Runnable介面。示例代碼如下:
importjava.util.Random;
publicclassMultiThread{
publicstaticvoidmain(Stringargs[])throwsInterruptedException{
System.out.println("使用繼承Thread的方式實現");
for(inti=0;i<10;i++){
MyThreadt=newMyThread("thread_"+i);
t.start();
}
Thread.sleep(1000);
System.out.println("使用實現Runnable介面的方式實現");
for(inti=10;i<20;i++){
MyThread2t=newMyThread2("thread_"+i);
newThread(t).start();
}
}
}
classMyThreadextendsThread{
privateStringthreadName;
publicMyThread(StringthreadName){
this.threadName=threadName;
}
@Override
publicvoidrun(){
longsleep=newRandom().nextInt(100)+100;
try{
//隨機延遲一段時間
Thread.sleep(sleep);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println(threadName+"開始執行...");
}
}
{
privateStringthreadName;
publicMyThread2(StringthreadName){
this.threadName=threadName;
}
@Override
publicvoidrun(){
longsleep=newRandom().nextInt(100)+100;
try{
//隨機延遲一段時間
Thread.sleep(sleep);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println(threadName+"開始執行...");
}
}
⑩ java,線程Thread(Runnable target)
你的理解很正確,只要是實現了Runnable介面的類都可以傳進去。
這個參數可以是API中已經有的,也可以是自己寫的。
常用的創建線程的方法有兩種,第一種就是繼承Thread類,直接new
出來就可以,Thread類本身也實現了Runnable介面。
第二種方法就是實現Runnable介面裡面的run方法。
語法正如你的代碼一樣