當前位置:首頁 » 編程語言 » threadjava

threadjava

發布時間: 2022-04-15 18:36:32

java線程Thread報錯

你這個問題是因為類載入順序的問題導致的,出現這個問題的原因就是你使用了內部類,而在外面這個類的靜態main方法裡面你創建了內部類的實例所導致的,解決方法比較簡單,在

classMyThreadextendsThread{}

在class前面加個static關鍵字就可以了

{}

具體原因的話是你可以這么理解,內部類就相當於外部類的一個屬性像下面這種情況

classStudent{
privateStringname;
privateintage;
....
classCourse{

}
publicstaticvoidmain(String[]args){}
}

像上面這種情況,你就可以理解為Course這個類的用法跟name,age這些屬性是一樣的,只不過他還是一個類罷了。通過這個對比我們知道,在main中不能直接訪問name,age等,因此也不能直接new Course這種情況。但是當我們在class前面加了static關鍵字之後,這種現象就打破了,Course就相當於一個普通的類了,只不過訪問規則會有些不同罷了。

看著你還不採納,我就心裡發慌,是不是沒說清楚,那我就詳細說一下吧。

在內部類Couse裡面的方法是可以直接訪問外部類的name,age等這些屬性的,是如何做到的呢,內部類裡面在編譯的時候是有一個指向外部類實例的引用的,這就要求要想創建內部類,就必須提前創建好外部類,否則這個指向外部類的實例的引用就沒法賦值。根據這個結論,我們可以退出這種形式是可以的

classStudent{
privateStringname;
privateintage;
....
publicCoursegetCourse(){
returnnewCourse();
}
classCourse{

}
publicstaticvoidmain(String[]args){}
}

添加的getCouse()方法裡面是可以直接new Course的,這是因為當你能執行一個類的普通方法的時候,這個類的實例就一定創建好了,所以這個時候內部類Course就可以獲取到外部類的實例。

而在main方法中,沒有創建外部類的實例,所以內部類也就沒發直接new出來,但是可以通過先創建外部類,再創建內部類的這種形式。這個時候你的代碼要稍微修改一下在創建MyThread的代碼修改為如下的形式:

TestInterrupttest=newTestInterrupt();
MyThreadthread=test.new.MyThread();

這種形式看著很奇怪,但是當理解了原理就可以理解為什麼要這么來寫。

當然還有一種更簡單的方法,那就是把你的內部類剪切到類的外面,就沒有上面這些規則了,這個時候的類就相當於一個普通的類。

大體結構是這樣的:

publicclassTestInterrupt{
....
}
//一定要放到大括弧的外面,否則就是內部類了,要符合上面的要求
classMyThreadextendsThread{
....
}

Ⅱ Java中Runnable和Thread的區別是什麼

在java中可有兩種方式實現多線程,一種是繼承Thread類,一種是實現Runnable介面;

Thread類是在java.lang包中定義的。一個類只要繼承了Thread類同時覆寫了本類中的run()方法就可以實現多線程操作了,但是一個類只能繼承一個父類,這是此方法的局限。

Ⅲ java中thread的start()和run()有何區別

1、start()方法來啟動線程,真正實現了多線程運行,這時無需等待。

run方法體代碼執行完畢而直接繼續執行下面的代碼;通過調用Thread類的start()方法來啟動一個線程,這時此線程是處於就緒狀態,並沒有運行。

通過Thread類調用方法run()來完成其運行操作的,這里方法run()稱為線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程終止,而CPU再運行其它線程。

2、run()方法當作普通方法的方式調用,程序還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的代碼;

而如果直接用run方法,這只是調用一個方法而已,程序中依然只有主線程--這一個線程,其程序執行路徑還是只有一條,這樣就沒有達到寫線程的目的。

3、調用start方法方可啟動線程,而run方法只是thread的一個普通方法調用,還是在主線程里執行。

4、這兩個方法需要把並行處理的代碼放在run()方法中,start()方法啟動線程將自動調用 run()方法,這是由jvm的內存機制規定的。並且run()方法必須是public訪問許可權,返回值類型為void.。

(3)threadjava擴展閱讀:

用start方法來啟動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。

通過調用Thread類的start()方法來啟動一個線程,這時此線程處於就緒(可運行)狀態,並沒有運行,一旦得到cpu時間片,就開始執行run()方法,這里方法 run()稱為線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程隨即終止。

run()方法只是類的一個普通方法而已,如果直接調用Run方法,程序中依然只有主線程這一個線程,其程序執行路徑還是只有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的代碼,這樣就沒有達到寫線程的目的。

Ⅳ java thread 使用

如果你是繼承的Thread類,那麼兩種方式都可以,還可以直接Thread.sleep(),因為sleep是靜態方法。如果是實現的Runnable介面就要用Thread.currentThread().sleep()這種方式。

Ⅳ Java中Runnable和Thread的區別

區別:Thread是類,而Runnable是介面。
抽象類和介面的區別如下:
① 在類來繼承抽象類時,只需實現部分具體方法和全部抽象方法,而實現介面則要實現裡面的全部方法。
②在介面中無成員變數,而抽象類中可有成員變數。
在Java中引進介面主要是為了解決多繼承的問題。
實現多線程主要繼承Thread 類和實現Runnable介面。

Ⅵ JAVA的Thread類的構造方法

Java的線程是通過java.lang.Thread類來實現的
構造方法:
Thread()
Thread(Runnable�0�2target)
參數:target 稱為被創建線程的目標對象。創建目標對象target的類負責實現 Runnable介面,給出該介面中run()方法的方法體。
利用構造方法創建新線程對象後,進入線程的新建狀態。

Ⅶ java裡面的Thread類存在的意義是什麼

Runnable是介面,只規定了run方法,本身不幹活的。
你可以用任何方式實現Runnable,Thread類也是Runnable的一個具體實現,它的實現方式是啟動一個新的線程,並執行run方法。
這樣的設計Java裡面到處都是,簡直成為一個常態。
介面是抽象的一個體現,只抽象功能,並不理會具體屬性和實現。

Ⅷ java中關於Thread的問題

import java.util.Date;
public class exe8_1
{
static Athread threadA;
static Bthread threadB;
public static void main(String args[])
{
threadA=new Athread();
threadB=new Bthread();
threadA.start();
threadB.start();
}
}
class Athread extends Thread
{
public void run()
{
for(int i=0;i<=3;i++)
{
Date TimeNow = new Date();//TimeNow要定義類型
System.out.println("A" + TimeNow.toString());//System要大寫
try
{
sleep(2000);
}
catch(InterruptedException e)
{
}
}
}
}
class Bthread extends Thread
{
public void run()
{
for(int i=0;i<=5;i++)//int i要分開
{
Date TimeNow = new Date();//TimeNow要定義類型
System.out.println("B" + TimeNow.toString());//System要大寫
try
{
sleep(1000);
}
catch(InterruptedException e)
{
}
}
}
}

Ⅸ java里thread怎麼實現定時調度

java Thread類實現定時調度,可以延遲幾秒之後再執行,代碼如下:


publicclassceshi{
publicstaticvoidmain(String[]args)throwsException{
//runinasecond
finallongtimeInterval=1000;
Runnablerunnable=newRunnable(){
@Override
publicvoidrun(){
while(true){
//-------codefortasktorun
System.out.println("Hello!!");
//-------endshere
try{
Thread.sleep(timeInterval);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
};
Threadthread=newThread(runnable);//線程創建
thread.start();//線程啟動

}

}

運行結果:

熱點內容
如何做一個文件壓縮包 發布:2025-01-21 10:17:45 瀏覽:184
壓縮草坐墊 發布:2025-01-21 10:01:33 瀏覽:399
編譯選項g 發布:2025-01-21 09:59:23 瀏覽:534
谷歌平板電腦無法登陸伺服器 發布:2025-01-21 09:43:55 瀏覽:108
刀劍亂舞腳本ios 發布:2025-01-21 09:41:06 瀏覽:521
2編程 發布:2025-01-21 09:36:50 瀏覽:776
把我的世界的ice伺服器炸了 發布:2025-01-21 09:31:01 瀏覽:681
sql資料庫導入數據 發布:2025-01-21 09:25:21 瀏覽:420
zynqsdk修改編譯選項 發布:2025-01-21 09:22:30 瀏覽:875
存儲器部件教學實驗 發布:2025-01-21 09:14:06 瀏覽:179