創建多線程的第一種方式:Thread類
//繼承Thread類,並重寫Thread類中的run()方法。
class ThreadCreate extends Thread{
//public static void main(String [] args){ 沒有必要寫主函數,編譯還是可以通過的
private int i = 0;//初始化的值,應該考慮到輸出幾次,如果從最大值開始考慮,for循環裏面用的應該是i--
@Override//嚴格區分大小寫
public void run(){//run()方法的方法體,代表了要運行的任務,稱之爲線程執行體
for(int i = 0;i < 20;i++){
if(i == 11){//等於"11",以便標識,下面的文字也是同理
System.out.println(Thread.currentThread().getName()+"..."+i+"這是run()方法控制的輸出語句");
}
}
}
//}
}
//運行代碼
class ThreadRun{
/*
public static void main(String [] args){
ThreadCreate t = new ThreadCreate();
t.run();
}
這個只是調用了run()方法
*/
public static void main(String [] args){
for(int i = 0;i < 20;i++){
//System.out.println(Thread.currentThread().getName()+"..."+i);
if(i == 10){//也就是說,if控制的對象其實並不是主線程,而是,確保在新的線程在主線程中只執行一次
//System.out.println(Thread.currentThread().getName()+"..."+i);
/*如果代碼放到了這個位置,主線程只會輸出main...10,而其他線程仍然輸出至19,說明if語句並沒有
控制其他線程,其他線程執行的內容爲線程執行體
*/
Thread t1 = new ThreadCreate();//線程進入新建狀態
Thread t2 = new ThreadCreate();
t1.start();//線程進入就緒狀態
t2.start();
System.out.println(Thread.currentThread().getName()+"..."+i+"這是主線程控制的輸出語句");
/*本來以爲其他線程沒有受if控制,是因爲線程沒有創建,但最終的執行結果和上面一樣。
引:所以如果真的理解"線程執行體"的概念,應該在run()方法的任務裏,對語句進行控制。
輸出結果:
Thread-0...11這是run()方法控制的輸出語句
Thread-1...11這是run()方法控制的輸出語句
main...10這是主線程控制的輸出語句
*/
}
}
}
}
創多線程的第二種方式:Runnable接口
/*利用Runnable接口來實現多線程的創建*/
//創建一個類實現Runnable接口
class MyRunnable implements Runnable{
private int i = 0;
public void run(){//該run()方法仍然是線程的執行體
for(i = 0;i < 20;i++){
System.out.println(Thread.currentThread().getName()+"..."+i);
}
}
}
//執行代碼
class RunnableTest{
public static void main(String [] args){
for(int i = 0;i < 20;i++){
System.out.println(Thread.currentThread().getName()+"..."+i);
if(i == 15){
Runnable r1 = new MyRunnable();
Runnable r2 = new MyRunnable();//Runnable接口指向子類對象
Thread t1 = new Thread(r1);//Runnalbe的子類實現作爲參數,Thread類重載的構造函數進行初始化,創建對象t1
Thread t2 = new Thread(r2);
t1.start();
t2.start();//最後還是通過Thread對象進入線程就緒狀態
}
}
}
}
兩者的區別:class MyRunnable implements Runnable{
private int i = 0;
public void run(){
System.out.println("MyRunnable...run...");
for(i = 0;i < 20;i++){
System.out.println(Thread.currentThread().getName()+"..."+i);
}
}
}
class MyThread extends Thread{
private int i = 0;
public MyThread(Runnable r){//Thread類裏其實有一個以Runnable爲參數的構造函數
super(r);//顯式的super(r);
}
public void run(){
System.out.println("MyThread...run...");//通過輸出發現執行的是MyThread裏的run()方法
for(i = 0;i < 20;i++){
System.out.println(Thread.currentThread().getName()+"..."+i);
}
}
}
class ThreadAndRunnable{
public static void main(String [] args){
for(int i = 0;i < 20;i++){
System.out.println(Thread.currentThread().getName()+"..."+i);
if(i == 15){
Runnable r = new MyRunnable();
Thread t = new MyThread(r);
t.start();
}
}
}
}
查看API:
Thread類中對Runnable接口中的方法run()的實現:
@Override
public void run(){
if(target != null){
target.run();
}
}
當執行到Thread類的run()方法的時候,首先會判斷target是否存在,存在則執行run()方法,也就是實現了Runnable接口並重寫run()方法。