併發編程使我們可以將程序劃分爲多個分離的、獨立運行的任務。通過多線程機制,這些獨立任務中的沒一個都將由執行線程來驅動。要搞清這些,就先搞清什麼叫線程?所謂線程,就是進程中的一個單一的順序控制流。
多線程的實現一般有三種方法:
1、繼承Thread類,重寫run()方法。
Thread本質上是Runnable接口的一個實例,它代表一個線程的實例,並且啓動線程的唯一方法就是通過Thread類的start()方法。
class MyThread extends Thread{
public void run(){
System.out.println("hello world"); //線程的函數體
}
}
public class Test{
public static void main(String[] args){
MyThread myThread=new MyThread();
thread.start(); //開啓線程
}
}
其中,start()方法是一個native方法,它將啓動一個新的線程,並執行run()方法。需要注意的是,調用start()方法後並不是立即執行多線程代碼,而是是的該線程變爲可運行態,至於什麼時候運行,由操作系統決定。
2、實現Runnable接口,實現run()方法。
主要步驟:(1)、自定義類並實現Runnable接口,實現run()方法。(2)、創建Thread對象,將自定義類的對象作爲參數實例化Thread對象。(3)、調用Thread的start方法。
class MyThread implements Runnable{ //創建線程類
public void run(){
System.out.println("Hello World");
}
}
public class Test{
public static void main(String[] args){
MyThread thread=new MyThread();
Thread t=new Thread(thread); //自定義實現Runnable對象作爲參數實例化Thread對象
t.start(); //開啓線程
}
}
3、使用Executor
Executor是JAVA SE5提供的爲你管理Thread對象的執行器,主要目的是爲了簡化併發編程,並且可以返回結果。Executor,Callable、Future都屬於Executors框架中功能類。Executor在客戶端和任務執行之間提供了一個間接層,與客戶端直接執行任務不同,這個中介將執行任務。而在JAVA語言中,Excutor是一個接口,如果需要執行器服務,則需要藉助Executors這個類(有點類似於Collection與Collections的關係)。這種方式來實現線程需要首先實現Callable接口,重寫call()方法,然後調用Executors的新建線程池的方法獲取ExecutorService,通過ExecutorService來獲取Future對象,然後通過Future對象的get方法就可以獲取Callable返回的Object了。
class MyExecutors implements Callable<String>{ //實現Callable接口
@Override
public String call() throws Exception { //實現call方法,返回String類型。
// TODO Auto-generated method stub
return "Hello World";
}
}
public class TestExecutors {
public static void main(String[] args) throws InterruptedException, ExecutionException{
// 通過Executors類中的方法來獲取一個線程池,提供執行器(Executor)服務
ExecutorService exec=Executors.newCachedThreadPool();
//submit()方法會產生Future對象,它用Callable返回結果的特定類型進行參數化。
Future<String> future=exec.submit(new MyExecutors());
//通過future對象的get方法來獲取結果。
System.out.println(future.get());
}
}