一:線程與以前所學的進程區別:
進程:系統進行資源分配的最小單位,資源是獨立的
線程:CPU調度的最小的單位,線程間共享資源。多線程幾個線程共佔據一個進程,單線程獨佔一個線程。安全
主線程就像是前臺接待,當工做量太多時,就指揮子線程去完成對應工做。多線程
二,如何建立線程
繼承Thread類和實現Runnable接口。
在使用Runnable接口時須要創建一個Thread實例。所以,不管是經過Thread類仍是Runnable接口創建線程,都必須創建Thread類或它的子類的實例。ide
Thread構造函數:
public Thread( );
public Thread(Runnable target);
public Thread(String name);
public Thread(Runnable target, String name);
public Thread(ThreadGroup group, Runnable target);
public Thread(ThreadGroup group, String name);
public Thread(ThreadGroup group, Runnable target, String name);
public Thread(ThreadGroup group, Runnable target, String name, long stackSize);函數
第一類:線程
public class ThreadDemo{ public static void main(String[] args){ Demo d = new Demo();//建立多線程 d.start();//啓動線程 for(int i=0;i<60;i++){ System.out.println(Thread.currentThread().getName()+i);//打印當前線程名稱 } } } class Demo extends Thread{//繼承thread類 public void run(){//run方法至關於線程的行動指南(作什麼工做) for(int i=0;i<60;i++){ System.out.println(Thread.currentThread().getName()+i);//打印名字 } } }
第二類:
public class ThreadDemo{
public static void main(String[] args){
Demo d =new Demo();
Thread t = new Thread(d);//Thread類或它的子類的實例。
t.start();
for(int x=0;x<60;x++){
System.out.println(Thread.currentThread().getName()+x);
}
}
}
class Demo implements Runnable{
public void run(){
for(int x=0;x<60;x++){
System.out.println(Thread.currentThread().getName()+x);
}
}
}
三:如何終止線程。code
使用退出標誌,使線程正常退出,也就是當run方法完成後線程終止。繼承
使用stop方法強行終止線程(這個方法不推薦使用,可能發生不可預料的結果)。接口
使用interrupt方法中斷線程。
舉例子:A通知B A.interrupt() A將指示燈置亮,B發生中斷,(若是B睡着的話,會存在通知不及時的狀況)
B如何查看指示燈狀態。Thread.interrupted()和Thread.isinterrupted()進程
Thread.isinterrupted()會將指示燈復位,置回原來的狀態。可查看任意線程的狀態。
Thread.interrupted()不會將指示燈復位,只可查看當前線程的狀態。內存
四:多線程安全問題
問題緣由:當多條語句在操做同一個線程共享數據時,一個線程對多條語句只執行了一部分,還沒執行完,另外一個線程參與進來執行,致使共享數據的錯誤。
解決辦法:對多條操做共享數據的語句,只能讓一個線程都執行完,在執行過程當中,其餘線程不執行。
兩個關鍵字:
volatile修飾變量,實現可見性,當線程的工做內存數據改變,主內存也隨之改變,
synchronized修飾方法,實現加鎖功能,當CPU發生調度時,保證本身的工做不會受別人打擾。
同步代碼塊:
public class ThreadDemo3 { public static void main(String[] args){ Ticket t =new Ticket(); Thread t1 = new Thread("線程一"); Thread t2 = new Thread("線程二"); Thread t3 = new Thread("線程三"); Thread t4 = new Thread("線程四"); t1.start(); t2.start(); t3.start(); t4.start(); } } class Ticket implements Runnable{ private int ticket =400; public void run(){ while(true){ synchronized (new Object()) { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } if(ticket<=0) break; System.out.println(Thread.currentThread().getName()+ticket--); } } } } 同步函數: public class ThreadDemo3 { public static void main(String[] args){ Ticket t =new Ticket(); Thread t1 = new Thread("線程一"); Thread t2 = new Thread("線程二"); Thread t3 = new Thread("線程三"); Thread t4 = new Thread("線程四");); t1.start(); t2.start(); t3.start(); t4.start(); } } class Ticket implements Runnable{ private int ticket = 4000; public synchronized void saleTicket(){ if(ticket>0) System.out.println(Thread.currentThread().getName()+ticket--); } public void run(){ while(true){ saleTicket(); } } }