threadjava
Ⅰ 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();//線程啟動
}
}
運行結果: