JUC--Callable 以及Lock同步鎖
阿新 • • 發佈:2018-08-02
dex void vat 解鎖 .get ktr 才會 靈活 back
/** * 一、創建執行線程的方式三:實現Callable接口。相較於實現Runnable接口方式,方法可以有返回值,並且可以拋出異常 * 二、callable 需要FutureTask實現類的支持。用於接受運算結果。FutureTask是Future接口的實現類。 * * 線程執行完之後才會執行result.get 可以當做閉鎖看 */ public class TestCallable { public static void main(String[] args) { ThreadDemo td = new ThreadDemo(); FutureTask<Integer> result = new FutureTask<>(td); new Thread(result).start(); //接受thread運算後的結構 try { Integer sum= result.get(); System.out.println(sum); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } }class ThreadDemo implements Callable<Integer> { @Override public Integer call() throws Exception { int sum=0; for(int i=0;i<=100;i++){ sum+=i; } return sum; } }
Lock:同步鎖
用於解決多線程安全問題的方式:
1 同步代碼塊
2 不同方法
3 同步鎖(更加靈活的方式)
/*** 顯示的鎖 使用lock方法上鎖 並且使用unlock方法解鎖 * 要在方法中上鎖和釋放鎖 方法必須執行 所以一般使用finally來釋放鎖 */ public class TestLock { public static void main(String[] args) { Ticket ticket = new Ticket(); new Thread(ticket,"win 1").start(); new Thread(ticket,"win 2").start(); new Thread(ticket,"win 3").start(); } } class Ticket implements Runnable{ private int tick=100; Lock lock = new ReentrantLock(); @Override public void run() { while(true){ lock.lock(); try{ if(tick>0){ try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"完成售票,余票為:"+--tick); } }finally { lock.unlock(); } } } }
ReentrantLock是Lock的實現類
在finally中調用lock.unlock
JUC--Callable 以及Lock同步鎖