Java多線程--認識多線程(Thread、Runnable)
1、進程與線程
dos係統:單進程。隻能有一個程序獨自運行,其他程序無法運行。
windows係統:多進程。同一時間段上有多個程序同時運行。



2、java的多線程實現
在java中實現多線程可以采用兩種方式:
繼承Thread類。
實現Runnable接口。
3、Thread類

java.lang包會在程序運行時自動導入,所以不用編寫import語句。
class MyThread extends Thread{ // 繼承Thread類,作為線程的實現類
private String name ; // 表示線程的名稱
public MyThread(String name){
this.name = name ; // 通過構造方法配置name屬性
}
public void run(){ // 覆寫run()方法,作為線程 的操作主體
for(int i=0;i<10;i++){
System.out.println(name + "運行,i = " + i) ;
}
}
};
以上完成了一個線程的操作類,然後直接使用此類就可以完成功能。class MyThread extends Thread{ // 繼承Thread類,作為線程的實現類
private String name ; // 表示線程的名稱
public MyThread(String name){
this.name = name ; // 通過構造方法配置name屬性
}
public void run(){ // 覆寫run()方法,作為線程 的操作主體
for(int i=0;i<10;i++){
System.out.println(name + "運行,i = " + i) ;
}
}
};
public class ThreadDemo01{
public static void main(String args[]){
MyThread mt1 = new MyThread("線程A ") ; // 實例化對象
MyThread mt2 = new MyThread("線程B ") ; // 實例化對象
mt1.run() ; // 調用線程主體
mt2.run() ; // 調用線程主體
}
};
程序的運行效果:

class MyThread extends Thread{ // 繼承Thread類,作為線程的實現類
private String name ; // 表示線程的名稱
public MyThread(String name){
this.name = name ; // 通過構造方法配置name屬性
}
public void run(){ // 覆寫run()方法,作為線程 的操作主體
for(int i=0;i<10;i++){
System.out.println(name + "運行,i = " + i) ;
}
}
};
public class ThreadDemo02{
public static void main(String args[]){
MyThread mt1 = new MyThread("線程A ") ; // 實例化對象
MyThread mt2 = new MyThread("線程B ") ; // 實例化對象
mt1.start() ; // 調用線程主體
mt2.start() ; // 調用線程主體
}
};


class MyThread extends Thread{ // 繼承Thread類,作為線程的實現類
private String name ; // 表示線程的名稱
public MyThread(String name){
this.name = name ; // 通過構造方法配置name屬性
}
public void run(){ // 覆寫run()方法,作為線程 的操作主體
for(int i=0;i<10;i++){
System.out.println(name + "運行,i = " + i) ;
}
}
};
public class ThreadDemo03{
public static void main(String args[]){
MyThread mt1 = new MyThread("線程A ") ; // 實例化對象
mt1.start() ; // 調用線程主體
mt1.start() ; // 錯誤
}
};
4、實現Runnable接口

class MyThread implements Runnable{ // 實現Runnable接口,作為線程的實現類
private String name ; // 表示線程的名稱
public MyThread(String name){
this.name = name ; // 通過構造方法配置name屬性
}
public void run(){ // 覆寫run()方法,作為線程 的操作主體
for(int i=0;i<10;i++){
System.out.println(name + "運行,i = " + i) ;
}
}
};
class MyThread implements Runnable{ // 實現Runnable接口,作為線程的實現類
private String name ; // 表示線程的名稱
public MyThread(String name){
this.name = name ; // 通過構造方法配置name屬性
}
public void run(){ // 覆寫run()方法,作為線程 的操作主體
for(int i=0;i<10;i++){
System.out.println(name + "運行,i = " + i) ;
}
}
};
public class RunnableDemo01{
public static void main(String args[]){
MyThread mt1 = new MyThread("線程A ") ; // 實例化對象
MyThread mt2 = new MyThread("線程B ") ; // 實例化對象
Thread t1 = new Thread(mt1) ; // 實例化Thread類對象
Thread t2 = new Thread(mt2) ; // 實例化Thread類對象
t1.start() ; // 啟動多線程
t2.start() ; // 啟動多線程
}
};
運行效果:
5、Thread類與Runnable接口的聯係

從定義格式上可以發現:Thread類也是Runnable接口的子類。
從類的關係上看,之前的做法非常類似於代理設計模式,Thread類完成比線程主體更多的操作。例如:分配cpu、判斷是否已經啟動等等。
6、Thread類與Runnable接口的區別
使用Thread類在操作多線程的時候,無法達到資源共享的母的。而使用Runnable接口實現的多線程可以實現資源共享。
class MyThread extends Thread{ // 繼承Thread類,作為線程的實現類
private int ticket = 5 ; // 表示一共有5張票
public void run(){ // 覆寫run()方法,作為線程 的操作主體
for(int i=0;i<100;i++){
if(this.ticket>0){
System.out.println("賣票:ticket = " + ticket--) ;
}
}
}
};
public class ThreadDemo04{
public static void main(String args[]){
MyThread mt1 = new MyThread() ; // 實例化對象
MyThread mt2 = new MyThread() ; // 實例化對象
MyThread mt3 = new MyThread() ; // 實例化對象
mt1.run() ; // 調用線程主體
mt2.run() ; // 調用線程主體
mt3.run() ; // 調用線程主體
}
};
三個線程各自賣各自的5張票,沒有達到資源共享。
class MyThread implements Runnable{ // 繼承Thread類,作為線程的實現類
private int ticket = 5 ; // 表示一共有5張票
public void run(){ // 覆寫run()方法,作為線程 的操作主體
for(int i=0;i<100;i++){
if(this.ticket>0){
System.out.println("賣票:ticket = " + ticket--) ;
}
}
}
};
public class RunnableDemo02{
public static void main(String args[]){
MyThread mt = new MyThread() ; // 實例化對象
new Thread(mt).run() ; // 調用線程主體
new Thread(mt).run() ; // 調用線程主體
new Thread(mt).run() ; // 調用線程主體
}
};
雖然啟動了三個線程,三個線程總共賣出了5張票。達到資源共享。
7、Thread類與Runnable接口使用結論

8、線程的狀態


實際上,線程調用start()方法的時候不是立刻啟動的,而是等待cpu進行調度的。
9、總結


最後更新:2017-04-03 14:53:40