1.進程與線程java
進程是程序的一次動態執行過程,它經歷了從代碼加載、執行到執行完畢的一個完整過程。
多線程
多進程操做系統能同時運行多個進程(程序),因爲CPU具有分時機制,因此每一個進程都能循環得到本身的CPU時間片。因爲CPU執行速度很是快,使得全部程序好像在"同時"運行。
ide
線程是在進程基礎上的進行進一步劃分。多線程是指一個進程在執行過程當中能夠產生多個線程,這些線程能夠同時存在、同時運行。
函數
多線程機制能夠同時運行多個程序塊,當有線程包含耗時操做(如循環),可讓另外一個線程作其餘的處理。傳統程序語言一次只能運行一個程序塊,遇到耗時操做只能按順序執行完耗操做才能繼續執行程序。
this
2.java中線程的實現
spa
①繼承Thread類
操作系統
語法線程
class 類名稱 extends Thread { //繼承Thread類 屬性...; //類中定義屬性 方法...; //類中定義方法 public void run() { //覆寫Thread類中的run()方法,此方法是線程的主體 //線程主體 } }
示例:orm
ThreadDemo.java 對象
class MyThread extends Thread { private String name; public MyThread(String name) { this.name = name; } public void run() { for (int i = 0; i < 10; i++) { System.out.println(name + "運行,i= " + i); } } } public class ThreadDemo { public static void main(String[] args) { // TODO Auto-generated method stub MyThread mt1 = new MyThread("線程A"); MyThread mt2 = new MyThread("線程A"); mt1.start(); mt2.start(); } }
注:使用start()方法啓動多線程而不用run()方法啓動線程的緣由。
start()方法調用start0()方法,start0()方法使用native關鍵字聲明,說明啓動多線程的實現須要依靠底層操做系統支持。
繼承Thread類實現多線程,同一線程類對象只能調用一次start()方法,調用屢次會出拋出IllegaIlThreadStateException異常。
源碼:
public synchronized void start() { /** * This method is not invoked for the main method thread or "system" * group threads created/set up by the VM. Any new functionality added * to this method in the future may have to also be added to the VM. * * A zero status value corresponds to state "NEW". */ if (threadStatus != 0) throw new IllegalThreadStateException(); /* Notify the group that this thread is about to be started * so that it can be added to the group's list of threads * and the group's unstarted count can be decremented. */ group.add(this); boolean started = false; try { start0(); started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { /* do nothing. If start0 threw a Throwable then it will be passed up the call stack */ } } } private native void start0();
②實現Runnable接口
語法:
class 類名稱 implements Runnable{ //實現Runnable接口 屬性...; //類中定義屬性 方法...; //類中定義方法 public void run() { //覆寫Runnable接口中的run()方法 //線程主體 } }
示例:
RunnableDemo.java
class MyThread extends Thread { private String name; public MyThread(String name) { this.name = name; } public void run() { for (int i = 0; i < 10; i++) { System.out.println(name + "運行,i= " + i); } } } public class RunnableDemo { public static void main(String[] args) { // TODO Auto-generated method stub MyThread mt1 = new MyThread("線程A"); MyThread mt2 = new MyThread("線程A"); Thread t1 = new Thread(mt1); Thread t2 = new Thread(mt2); t1.start(); t2.start(); } }
啓動線程須要Thread類中的start()方法,Thread類中的run()方法調用的是Runnable接口中的run()方法,此方法由Runnable子類完成,因此若是經過繼承Thread類實現多線程,則必須覆寫run()方法。
Thread類中的構造函數接受Runnable的子類,因此能夠經過Thread類來啓動該線程。
源碼:
private Runnable target; public Thread(Runnable target,String name){ init(null,target,name,0); } ... public void run(){ if(target != null){ target.run(); } }
使用Runnable接口實現多線程能夠避免因爲java的單繼承帶來的侷限。
注:
1.java爲何不支持多繼承
多繼承主要是由於不少同名方法,或者是同名屬性容易記混,可是接口,是對方法的重寫,並且是一個接口每每有一個特定的方法,雖然方法是同樣的,可是能夠經過接口的不一樣來區分。