Java8多執行緒的啟動方法
阿新 • • 發佈:2019-02-04
一、程序與執行緒的區別
總:作業系統執行多工,每個任務就是程序;程序執行多工,每個任務就是執行緒;包含關係
分:
1.排程性:在引入執行緒的OS中,把執行緒作為排程和分派的基本單位,把程序作為資源擁有的基本單位
2.併發性:在引入執行緒的OS中,不僅程序間可以併發執行,一個程序的多個執行緒之間也可以併發執行
3.擁有資源:程序是擁有資源的基本單位,執行緒除了擁有一點執行中必不可少的資源(執行緒控制塊,程式計數器,一組暫存器值和堆疊)外,本身基本沒有系統資源,但是可以訪問程序的資源。
4.建立或撤銷程序時系統都要為它分配或回收資源,程序切換所要保留的現場資訊也多於執行緒。由於一個程序的執行緒間共享同一地址空間和開啟檔案,因此它們的同步與通訊更加容易。
二、多執行緒的啟動方法
1、繼承Thread:重寫run()方法,呼叫start()啟動執行緒
public class TestThread extends Thread
{
@Override
public void run()
{
//寫入具體方法
//getName()是例項方法,返回當前執行緒名
System.out.println(getName());
//currentThread()是類方法,返回正在執行的執行緒物件
Thread.currentThread();
}
public static void main()
{
TestThread thread = new TestThread();
thread.start();
}
}
2、實現Runnable介面建立執行緒類
public class TestRunnable implements Runnable
{
public void run()
{
//寫入具體方法
}
public static void main()
{
//1.以介面實現物件和執行緒名作為建構函式的引數
TestRunnable runnable = new TestRunnable();
Thread thread1 = new Thread(runnable,"thread1");
thread1.start();
//2.Lambda表示式建立執行緒
Thread thread2 = new Thread(()->{
//寫入具體方法
},"thread2");
thread2.start();
//3.匿名類建立執行緒
Thread thread3 = new Thread(new Runnable()
{
@Override
public void run()
{
//寫入具體方法
}
},"thread3");
thread3.start();
}
}
Tip:設定Android Studio支援Lambda表示式的方法
http://blog.csdn.net/nicolelili1/article/details/52275263
3、使用Callable和Future建立執行緒
用法與Runnable大同小異,Callable介面提供call()方法,支援返回值並可以丟擲異常;Future介面代表Callable接口裡call()的返回值。Lambda表示式方法不再舉例
public class TestCallableFuture
{
public static void main()
{
FutureTask<Integer> task = new FutureTask<Integer>(
new Callable<Integer>()
{
@Override
public Integer call() throws Exception
{
return null;
}
}
);
new Thread(task,"有返回值的執行緒").start();
try
{
/**
* get方法獲取call()的返回值,該方法造成程式阻塞,等子執行緒執行結束獲得返回值
* 可以傳入等待時間(時長,時間單位),超出時間丟擲TimeoutException異常
*/
System.out.println(task.get().toString());
System.out.println(task.get(1000,TimeUnit.MILLISECONDS).toString());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
4.小結:使用2、3方法可以使多個執行緒共享一個target物件,推薦