
1.繼承Thread
* 定義類繼承Thread
* 重寫run方法
* 把新線程要作的事寫在run方法中
* 建立線程對象
* 開啓新線程, 內部會自動執行run方法
public class Demo2_Thread {
public static void main(String[] args) {
MyThread mt = new MyThread(); //4,建立自定義類的對象
mt.start(); //5,開啓線程
for(int i = 0; i < 3000; i++) {
System.out.println("bb");
}
}
}
class MyThread extends Thread { //1,定義類繼承Thread
public void run() { //2,重寫run方法
for(int i = 0; i < 3000; i++) { //3,將要執行的代碼,寫在run方法中
System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
}
}html
* 2.實現Runnable
* 定義類實現Runnable接口
* 實現run方法
* 把新線程要作的事寫在run方法中
* 建立自定義的Runnable的子類對象
* 建立Thread對象, 傳入Runnable
* 調用start()開啓新線程, 內部會自動調用Runnable的run()方法ide
public class Demo3_Runnable {
public static void main(String[] args) {
MyRunnable mr = new MyRunnable(); //4,建立自定義類對象
//Runnable target = new MyRunnable();
Thread t = new Thread(mr); //5,將其看成參數傳遞給Thread的構造函數
t.start(); //6,開啓線程
for(int i = 0; i < 3000; i++) {
System.out.println("bb");
}
}
}
class MyRunnable implements Runnable { //1,自定義類實現Runnable接口
@Override
public void run() { //2,重寫run方法
for(int i = 0; i < 3000; i++) { //3,將要執行的代碼,寫在run方法中
System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
}
}函數

匿名內部類:post




在Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護線程) this
用個比較通俗的好比,任何一個守護線程都是整個JVM中全部非守護線程的保姆:url
只要當前JVM實例中尚存在任何一個非守護線程沒有結束,守護線程就所有工做;只有當最後一個非守護線程結束時,守護線程隨着JVM一同結束工做。spa
Daemon的做用是爲其餘線程的運行提供便利服務,守護線程最典型的應用就是 GC (垃圾回收器),它就是一個很稱職的守護者。.net
User和Daemon二者幾乎沒有區別,惟一的不一樣之處就在於虛擬機的離開:若是 User Thread已經所有退出運行了,只剩下Daemon Thread存在了,虛擬機也就退出了。 由於沒有了被守護者,Daemon也就沒有工做可作了,也就沒有繼續運行程序的必要了。線程

thread.Join把指定的線程加入到當前線程,能夠將兩個交替執行的線程合併爲順序執行的線程。3d
好比在線程B中調用了線程A的Join()方法,直到線程A執行完畢後,纔會繼續執行線程B。
t.join(); //調用join方法,等待線程t執行完畢
t.join(1000); //等待 t 線程,等待時間是1000毫秒。
Thread.yield()方法的做用:暫停當前正在執行的線程,並執行其餘線程。(可能沒有效果)
yield()讓當前正在運行的線程回到可運行狀態,以容許具備相同優先級的其餘線程得到運行的機會。所以,使用yield()的目的是讓具備相同優先級的線程之間可以適當的輪換執行。可是,實際中沒法保證yield()達到讓步的目的,由於,讓步的線程可能被線程調度程序
再次選中。
結論:大多數狀況下,yield()將致使線程從運行狀態轉到可運行狀態,但有可能沒有效果。




鎖對象要惟一的, this表明實例這個對象,每一個線程都會實例對象,致使不是惟一。 類.class 惟一