Java虛擬機時是運行所有Java程序的抽象計算機,允許應用并發的運行多個線程。在Java語言中,多線程的實現,一般有以下3中方法:
1.實現Runnable接口,并實現該接口的run()方法;
主要步驟:
1.自定義類并實現Runnable接口,實現run()方法;
2.創建Thread類,用實現Runnable接口的對象作為參數實例化該Thread對象;
3.調用Thread類的start()方法;
class MyThread implements Runnable{
//創建線程
public void run(){
System.out.println("Thread body");
}
}
public class Test{
public static void main(String[]args){
MyThread thread=new MyThread();
Thread t=new Thread(thread);
t.start;//開啟線程
}
}
2.繼承Thread類,重寫run方法
Thread類本質上也是實現了Runnable接口的一個實例,它代表一個線程的實例,并且,啟動線程的唯一方法就是通過Thread類的start()方法。start()方法是一個native(本地)方法,它將啟動一個新線程,并執行run()方法。這種方式通過自定義類直接extends Thread,并重寫run()方法,就可以啟動新線程并執行自己定義的run()方法。需要注意的是,當star()方法調用后并不是立即執行多線程代碼,而是使得該線程變為可運行態(Runnable),什么時候運行多線程代碼是由操作系統決定的。
class MyThread extends Thread{
//創建線程類
public void run(){
System.out.println("Thread body");
}
}
public class Test{
public static void main(String[]args){
MyThread thread=new MyThread();
thread.start();//開啟線程
}
}
3.實現Callable接口,重寫call()方法;
Callable對象實際上是屬于Excutor框架中的功能類,Callable接口與Runnable接口類似,但是提供了比Runnable接口更強大的功能,主要表現為以下三點:
1.Callable可以在任務結束后提供一個返回值,Runnable無法提供這個功能;
2.Callable中的call()方法可以拋出異常,而Runnable的run方法不能拋出異常;
3.運行Callable可以拿到一個Future對象,Future對象表示異步計算的結果。它提供了檢查計算是否完成的方法。由于線程屬于異步計算模型,所以無法從其他線程中得到方法的返回值,在這種情況下,就可以使用Future來監視目標線程調用call()方法的情況,當調用Future的get()方法以獲取結果時,當前線程就會阻塞,直到call()方法結束返回結果。
import java.util.concurrent.*
public class CallableAndFuture{
public static class CallableTest implements Callable
public String call()throws Exception{
return "Hello World!"
}
}
public static void main(String []args){
ExcutorService threadPool=Executor.newSingleThreadExecutor();
Future<String>future=threadPool.submit(new CallableTest());
try{
System.out.println("waiting thread to finish");
System.out.println(future.get());
}
catch(Exception e){
e.printStackTrace();
}
}
}
本文來自博客園,作者:{不二一哥},轉載請注明原文鏈接:http://www.rzrgm.cn/yige888/p/17991479
浙公網安備 33010602011771號