一、創建線程的三種方式
1.繼承Thread類
public class MyThread extends Thread {
String name;
public MyThread(String name) {
this.name = name;
System.out.println("繼承Thread類");
}
@Override
public void run() {
System.out.println(name + "正在運行……");
}
}
public static void main(String[]args){
MyThread t1 = new MyThread("線程1");
MyThread t2 = new MyThread("線程2");
t2.start();
t1.start();
}
2.實現Runnable接口
public class MyThread2 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"正在運行……");
}
}
public static void main(String[]args){
MyThread2 run = new MyThread2();
//此處注意需要把run作為參數傳到Thread類中
Thread t1 = new Thread(run,"線程1");
Thread t2 = new Thread(run,"線程2");
t1.start();
t2.start();
}
注意:創建的Runnable實現類只是一個target,不是線程對象,它用來指明線程運行時需要做的任務,Thread類的對象才是線程對象。
3.實現Callable接口
public class MyThread3 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int a = new Random().nextInt(100);
System.out.println("線程執行結果 "+a);
return a;
}
}
public static void main(String[]args){
Callable<Integer> call = new MyThread3();
FutureTask<Integer> future = new FutureTask<Integer>(call);
new Thread(future).start();
}
二、兩種啟動方式run()與start()
1.run()
- run()方法可以被重復調用;
- 如果直接調用run方法,并不會啟動新線程!程序中依然只有主線程這一個線程,其程序執行路徑還是只有一條,還是要順序執行,還是要等待run方法體執行完畢后才可繼續執行下面的代碼,這樣就沒有達到多線程的目的。
2.start()
- start()不能被重復調用;
- start()方法來啟動的新線程,處于就緒(可運行)狀態,并沒有運行,一旦得到cpu時間片,就開始執行相應線程的run()方法,這里方法run()稱為線程體,它包含了要執行的這個線程的內容,run方法運行結束,此線程隨即終止;
- 用start方法來啟動線程,真正實現了多線程運行,即無需等待某個線程的run方法體代碼執行完畢就直接繼續執行下面的代碼;