1. 程式人生 > >JUC--Callable 以及Lock同步鎖

JUC--Callable 以及Lock同步鎖

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同步鎖