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);