在java中我們使用多線程的情況 一般就兩種情況.第一種:繼承thread.第二種:實現runnable.
那麼我們先來看看第一種繼承thread的情況:
對於直接繼承Thread的類來說,代碼大致框架如下:
class 類名 extends Thread{
方法1;
方法2;
.........
public void run(){
}
屬性1;
屬性2;
..........
}
那麼我們先來看一個簡單的例子.代碼如下:
public class DoubleDemo extends Thread{
private String name;
public DoubleDemo(String name){
this.name=name;
}
//主方法
public void run(){
for(int i=0;i<5;i++){
System.out.println(name+"運行===>"+i);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
DoubleDemo d1=new DoubleDemo("A");
DoubleDemo d2=new DoubleDemo("B");
d1.start();
d2.start();
}
}
[輸出結果:]
A運行===>0
B運行===>0
A運行===>1
A運行===>2
B運行===>1
A運行===>3
B運行===>2
B運行===>3
B運行===>4
A運行===>4
因爲需要用到CPU的資源,所以每次的運行結果基本上都不是一樣的.注意:雖然我們在這裏調用的是start()方法,
但是實際上主體作用還是run()方法.
那麼:爲什麼我們不能直接調用run()方法呢?
我的理解是:線程的運行需要本地操作系統的支持.
如果你查看start源代碼的時候你會發現: 有一句調用的是start0().並且這個方法用了native關鍵字.次關鍵字標示調用本地操作系統的函數.因爲多線程的實現
需要本地操作系統的支持.但是start方法重複調用的話,會出現 java.lang.illegalthreadstateException異常
第二種情況 通過實現runnable接口:
大致框架是:
class 類名 implement Runnable{
方法1;
方法2;
.........
public void run(){
}
屬性1;
屬性2;
..........
}
我們將上面的例子稍微修改一下 如下:
public class MyRunnable implements Runnable{
private String name;
public MyRunnable(String name){
this.name=name;
}
public void run(){
for(int i=0;i<5;i++){
System.out.println(name+"運行======>"+i);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyRunnable m1=new MyRunnable("線程A");
Thread t1=new Thread(m1);
MyRunnable m2=new MyRunnable("線程B");
Thread t2=new Thread(m2);
t1.start();
t2.start();
}
}
[運行結果]
線程A運行======>0
線程B運行======>0
線程A運行======>1
線程A運行======>2
線程A運行======>3
線程A運行======>4
線程B運行======>1
線程B運行======>2
線程B運行======>3
線程B運行======>4
關於我們到底選擇哪一個,就要看你的程序設計了.如果一個類繼承Thread 則不適合資源共享.但是如果實現runnable,則很容易實現資源共享. 下一篇我們將深入瞭解.