/** * 1、建立執行線程的方式三:實現Callable接口。相較於實現Runnable接口方式,方法能夠有返回值,而且能夠拋出異常 * 2、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 同步代碼塊ide
2 不一樣方法spa
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的實現類code
在finally中調用lock.unlockblog