初學Java多線程的基本概念

一:線程與以前所學的進程區別:
進程:系統進行資源分配的最小單位,資源是獨立的
線程: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

  1. 使用退出標誌,使線程正常退出,也就是當run方法完成後線程終止。繼承

  2. 使用stop方法強行終止線程(這個方法不推薦使用,可能發生不可預料的結果)。接口

  3. 使用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();
        }
    }
}
相關文章
相關標籤/搜索