當前位置:首頁 » 編程語言 » 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-05-19 15:47:14 瀏覽:405
ct4哪個配置性價比最高 發布:2025-05-19 15:38:02 瀏覽:953
如何設置強緩存的失效時間 發布:2025-05-19 15:21:28 瀏覽:695
winxp無法訪問 發布:2025-05-19 15:19:48 瀏覽:947
文件預編譯 發布:2025-05-19 15:14:04 瀏覽:643
怎麼在伺服器上掛公網 發布:2025-05-19 15:14:02 瀏覽:272
濟南平安e通如何找回密碼 發布:2025-05-19 14:56:58 瀏覽:176
安卓手機如何找到iccid碼 發布:2025-05-19 14:46:51 瀏覽:227
編譯的內核為什麼那麼大 發布:2025-05-19 14:45:21 瀏覽:179
什麼控制壓縮 發布:2025-05-19 14:28:13 瀏覽:931