Java併發編程基礎

1.實現多線程的兩種方式:

(1)繼承Thread類; (2)實現Runnable接口

//進程:每個進程都有獨立的代碼和數據空間(進程上下文),進程間的切換開銷比較大,一個進程包含1-n個線程
//線程:同一類線程共享代碼和數據空間,每個線程擁有獨立的運行棧和程序計數器,線程切換開銷小
//多進程是指操作系統能同時運行多個任務(程序)。
//多線程是指在同一程序中有多個順序流在執行。

//實現多線程的兩種方式:(1)繼承Thread類; (2)實現Runnable接口


public class ThreadTest {

	public static void main(String[] args)
	{
		MyThread t1 = new MyThread("t1");
		MyThread t2 = new MyThread("t2");
		t1.start();
		t2.start();
		
	}
}


class MyThread extends Thread
{
	private String name;
	public MyThread(String name)
	{
		this.name = name;
	}
	@Override
	public void run()
	{
		for(int i = 0; i < 5 ; i++)
		{
			System.out.println(name + ":" + i);
			try {
				sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
}
//實現多線程的兩種方式:(1)繼承Tread類; (2)實現Runnable接口
//如果一個類繼承Thread,則不適合資源共享。但是如果實現了Runable接口的話,則很容易的實現資源共享。
public class ThreadTest2 {

	public static void main(String[] args)
	{
		MyThread2 t1 = new MyThread2();
		new Thread(t1).start();
		new Thread(t1).start();
		new Thread(t1).start();
	}
}


class MyThread2 implements Runnable
{
	private int tickets = 10;
	@Override
	public synchronized void run()
	{
		for(int i = 0; i < 10; i++ )
		{
			if(this.tickets > 0)
			{
				System.out.println("買票" + this.tickets-- );
			}
		}
	}
	
}

2. 常用函數

(1)獲取和設置線程的名稱

獲取:String getName( );

設置:Thread(Runnable r, String name); 或 thread.setName("name");

(2)判斷一條線程的存活狀態

thread.isAlive();

一條線程的壽命起始於start()方法,終止於離開run方法.

(3)獲取一條線程的執行狀態

thread.getState();

線程的執行狀態有:new; runnable; blocked; waiting; time_waiting; terminated

(4)獲取和設置線程的優先級

獲取: int getPriority();  

設置: thread.setPriority(int priority);

使用setPriority()會影響 應用程序的可移植性

(5)獲取和設置線程的守護線程狀態

一條守護線程扮演非守護線程輔助者的角色;會在應用程序最後一條非守護線程消失後自動死亡,因此應用程序才能終止。

獲取:Thread的 boolean isDaemon( );

設置:Thread 的 void setDaemon(boolean isDaemon);

(6)啓動線程

調用Thread 的void start() 方法啓動與該對象關聯的線程。

(7)中斷線程

public boolean isInterrupted()

public void interrupt()

public static boolean interrupted()

isInterrupted是一個實例方法,主要用於判斷當前線程對象的中斷標誌位是否被標記了,如果被標記了則返回true表示當前已經被中斷,否則返回false。調用isInterrupted並不會清除線程對象的中斷標識位。

interrupt是一個實例方法,該方法用於設置當前線程對象的中斷標識位。

interrupted是一個靜態的方法,用於返回當前線程是否被中斷。該方法用於判斷當前線程是否被中斷,並且該方法調用結束的時候會清空中斷標識位。

(8)中斷線程

void join(); 
void join(long millis); // 等待該線程終止的最長時間爲millis毫秒 
void join(long millis, int nanos); // 等待該線程終止的最長時間爲millis毫秒+nanos納秒

使用Thread的join()方法,join()方法會阻塞主線程繼續向下執行,直到子線程執行完畢。如果不採用join()方法的話,會先執行完main線程,子線程繼續執行。

(9)線程睡眠

Thread類聲明瞭一對靜態方法使線程睡眠(暫時性地停止執行)

void sleep(loong millis);

void sleep(long millis, int nanos);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章