首先瞭解線程的狀態轉換圖: 在Java中一個類要當做線程來使用有兩種方法: 1)繼承Thread類,並重寫run函數 2)實現Runable介面,並重寫run函數 Java是單繼承的,但某些情況下一個類可能已經繼承了某個父類,則不能再繼承Thread類創建線程,只能用第二種。 下麵是針對同一問題“編 ...
首先瞭解線程的狀態轉換圖:
在Java中一個類要當做線程來使用有兩種方法:
1)繼承Thread類,並重寫run函數
2)實現Runnable介面,並重寫run函數
Java是單繼承的,但某些情況下一個類可能已經繼承了某個父類,則不能再繼承Thread類創建線程,只能用第二種。
下麵是針對同一問題“編寫一個程式,該程式每隔一秒自動輸出Hello World,輸出10次後自動退出”的兩種不同方案。
方案一:
1 public class Demo_1 { 2 public static void main(String[] args) { 3 Cat cat=new Cat(); //創建一個Cat對象 4 cat.start(); //啟動線程,會導致run()函數的運行 5 } 6 } 7 8 class Cat extends Thread{ 9 int times=0; 10 //重寫run()函數 11 public void run(){ 12 while(true){ 13 //休眠一秒,1000表示1000毫秒,sleep就會讓該線程進入Blocked狀態,並釋放資源 14 try { 15 Thread.sleep(1000); 16 } catch (InterruptedException e) { 17 // TODO Auto-generated catch block 18 e.printStackTrace(); 19 } 20 times++; 21 System.out.println("Hello World"+ times); 22 23 if(times==10){ 24 break; //退出 25 } 26 } 27 } 28 }
方案二:
1 public class Demo_2 { 2 public static void main(String[] args){ 3 //註意啟動 4 Dog dog=new Dog(); 5 Thread t=new Thread(dog); 6 t.start(); 7 } 8 } 9 10 class Dog implements Runnable{ 11 int times=0; 12 public void run(){ 13 while(true){ 14 //休眠一秒 15 try { 16 Thread.sleep(1000); 17 } catch (InterruptedException e) { 18 e.printStackTrace(); 19 } 20 times++; 21 System.out.println("Hello World"+times); 22 23 if(times==10){ 24 break; 25 } 26 } 27 } 28 }