java線程


1.線程的創建:(兩種方法)
    1)繼承Thread類,重寫裏面的run方法,將要運行的代碼放在run方法中
    2)實現Runnalble接口,實現裏面的run方法,將線程要運行的程序放在run方法中,
創建Thread線程,將Runnable對象作爲參數傳遞給Thread對象,調用Thread對象的start方法,使Runnable中的run方法運行:如:

package com.itcast.day10;

/**
 * 創建一個類實現Runnable接口
 * @author Yxx
 *
 */
class Cyte implements Runnable{
	private int i=100;
	public void run() {
		while(true){
			if(i>0){
				System.out.println(Thread.currentThread().getName()+"------"+i--);
			}
		}
	}
}

/**
 * 
 * @author Yxx
 *
 */
public class ThreadDemo {
	public static void main(String[] args) {
		//創建一個Runable實例
		Cyte c = new Cyte();
		//創建線程將Runnable接口實例作爲參數傳給Thread構造函數
		Thread t = new Thread(c);
		Thread t1 = new Thread(c);
		Thread t2 = new Thread(c);
		Thread t3 = new Thread(c);
		Thread t4 = new Thread(c);
		//將線程啓動
		t.start();
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}




2.線程的幾種狀態

11cbdfc6-e4d9-3851-b3fd-6e7ca1d42cdd.jpg
1.被創建:當用new關鍵字創建一個線程實例,但還沒有調用start方法
2.運行:線程調度程序將處於就緒狀態的線程置爲當前線程時,線程爲允許狀態,開始執行run方法中的代碼
3.就緒狀態:當線程調用了start方法之後線程進入了就緒狀態,等待着線程調度程序將線程置爲當前線程,線程纔會處於運行狀態。
4.阻塞:當程序正在運行狀態,調用了wait方法或者sleep方法時,程序處於阻塞狀態,當程序調用notify方法時,程序纔會被喚醒,但不一定馬上進入運行狀態,而是在就緒狀態等待
5.死亡:當一個線程中的run方法裏面的程序執行完成,或者調用了stop方法,程序就會處於死亡狀態,對於已經死亡的線程,無法再調用start使他進入就緒狀態
代碼同步
對於多個線程訪問同一個共享資源,有時候會出現數據共享的錯誤,原因就是因爲cpu的調度不是人爲能控制,當cpu在執行完if判斷之後,當前線程處於阻塞狀態,而cpu去執行其他權限更高的程序,cpu會在當前執行處記住一個地址,等cpu執行完其他程序,它就會更據那個地址繼續向前執行,在執行過程中可能i的值已經到了1,而現在又不用判斷,所以就出現了0,-1的現象
3.代碼同步
對於多個線程訪問同一個共享資源,有時候會出現數據共享的錯誤,原因就是因爲cpu的調度不是人爲能控制,當cpu在執行完if判斷之後,當前線程處於阻塞狀態,而cpu去執行其他權限更高的程序,cpu會在當前執行處記住一個地址,等cpu執行完其他程序,它就會更據那個地址繼續向前執行,在執行過程中可能i的值已經到了1,而現在又不用判斷,所以就出現了0,-1的現象
class Cyte implements Runnable{
	private int i=100;
	public void run() {
		while(true){
			if(i>0){
				try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}	System.out.println(Thread.currentThread().getName()+"------"+i--);
			}
		}
	}
}


eacc346a-5320-390b-a3dc-86ff60491b51.jpg
如果需要對操作共享資源的代碼塊添加代碼同步。如:
class Cyte implements Runnable{
	private int i=100;
	Object o = new Object();
	public void run() {
		while(true){
			synchronized (o) {
				if(i>0){
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()+"------"+i--);
				}
			}
		}
	}
}


  • 11cbdfc6-e4d9-3851-b3fd-6e7ca1d42cdd-thumb.jpg
  • 大小: 32.8 KB
  • eacc346a-5320-390b-a3dc-86ff60491b51-thumb.jpg
  • 大小: 27.6 KB
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章