1、繼承Thread創建線程
public class ThreadDemo { public static void main(String[] args) { ThreadTest1 st1=new ThreadTest1("張三"); ThreadTest1 st2=new ThreadTest1("李四"); //調用start方法開啟線程 st1.start(); st2.start(); System.out.PRintln(" main over...."+Thread.currentThread().getName()); }}class ThreadTest1 extends Thread{ String name; public ThreadTest1(String name) { this.name=name; } //run方法定義線程要運行的任務代碼 public void run(){ for (int i = 0; i < 10; i++) { System.out.println(i+"......"+name+"....."+Thread.currentThread().getName()); } }}線程的狀態:
sleep:到時間自動回到運行狀態
wait:不調用線程的notify方法則一直處于凍結狀態,凍結狀態是指任務被移出CPU任務處理隊列
2、繼承Runnable接口創建線程
//繼承Runnable接口創建線程public class RunnableDemo {public static void main(String[] args) { RunnableTest test=new RunnableTest(); //將Runnable接口的實現類作為參數傳遞給Thread的構造方法,用以明確線程的任務 Thread t1=new Thread(test); Thread t2=new Thread(test); t1.start(); t2.start();}}class RunnableTest implements Runnable{ @Override public void run() { show(); } public void show(){ for (int i = 0; i < 10; i++) { System.out.println(i+"...."+Thread.currentThread().getName()); } }}賣票問題:同步代碼塊:
//賣票問題//線程安全問題產生的原因:多個線程在操作共享數據,且操作共享數據的線程代碼有多條,當一個線程操作多條共享代碼的過程中,其他進程參與了運算,//就產生了線程安全問題//利用同步代碼塊可以解決線程安全問題synchronized//同步的前提是多線程必須持有同一個鎖public class SaleTicket { public static void main(String[] args) { SaleTicketDemo saleTicketDemo=new SaleTicketDemo(); //四個線程執行同一個任務 Thread t1=new Thread(saleTicketDemo); Thread t2=new Thread(saleTicketDemo); Thread t3=new Thread(saleTicketDemo); Thread t4=new Thread(saleTicketDemo); t1.start(); t2.start(); t3.start(); t4.start(); }}class SaleTicketDemo implements Runnable{ private int num=100; Object obj=new Object();//同步鎖對象必須放在run方法以外 @Override public void run() { while(true){ synchronized (obj) { if(num>0){ try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"....."+num--); } } } } }}同步函數:
public class SaleTicket { public static void main(String[] args) { SaleTicketDemo saleTicketDemo=new SaleTicketDemo(); //四個線程執行同一個任務 Thread t1=new Thread(saleTicketDemo); Thread t2=new Thread(saleTicketDemo); Thread t3=new Thread(saleTicketDemo); Thread t4=new Thread(saleTicketDemo); t1.start(); t2.start(); t3.start(); t4.start(); }}class SaleTicketDemo implements Runnable{ private int num=100; Object obj=new Object();//同步鎖對象必須放在run方法以外 @Override public void run() { while(true){ show(); } } //同步函數,同步函數的鎖是this public synchronized void show(){ if(num>0){ try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"....."+num--); } } }線程之間的通信:
package Thread;/* * 當線程執行wait()時,會把當前的鎖釋放,然后讓出CPU,進入等待狀態。 * 當執行notify/notifyAll方法時,會喚醒一個處于等待該 對象鎖 的線程,然后繼續往下執行,直到執行完退出對象鎖鎖住的區域(synchronized修飾的代碼塊)后再釋放鎖。 * * */class Resource{ String name; String sex; //資源中是否含有數據,false為不含數據 boolean flag=false;}class Input implements Runnable{ Resource r; public Input(Resource r) { this.r = r; } @Override public void run() { int x=0; while(true){ synchronized (r) { if(r.flag){ try { r.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else{ if(x==0){ r.name="張三"; r.sex="男"; }else{ r.name="李四"; r.sex="女"; } r.flag=true; r.notify(); x=(x+1)%2; } } } } }class Output implements Runnable{ Resource r; public Output(Resource r) { this.r = r; } @Override public void run() { while(true){ synchronized (r) { if(!r.flag){ try { r.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else{ System.out.println(r.name+"....."+r.sex); r.flag=false; r.notify(); } } } } }public class ThreadTalk { public static void main(String[] args) { Resource resource=new Resource(); Input input=new Input(resource); Output output=new Output(resource); Thread t1=new Thread(input); Thread t2=new Thread(output); t1.start(); t2.start(); }}
新聞熱點
疑難解答