1. 程式人生 > >java多線程快速入門(十八)

java多線程快速入門(十八)

user static 的區別 con als sync ack pack exceptio

Lock鎖是JDK1.5之後推出的並發包裏面的關鍵字(註意捕獲異常,釋放鎖)

Lock與synchronized的區別

  Lock鎖可以人為的釋放鎖(相當於汽車中的手動擋)

  synchronized當線程執行完畢或者拋出異常的話,鎖自動釋放(相當於汽車中的自動擋)

Condition用法

  Condition的功能類似於在傳統的線程技術中的Object.wait()和Object.notify()的功能

package com.cppdy;

import java.util.concurrent.locks.Condition;
//JDK1.5之後出現的並發包
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; class User1 { public String username; public String sex; // 如果flag為false 證明變量可寫不可讀 // 如果flag為true 證明變量可讀不可寫 public boolean flag = false; public Lock lock = new ReentrantLock(); } class InputThread1 extends Thread { private
User1 user; private Condition condition; public InputThread1(User1 user,Condition condition) { this.user = user; this.condition=condition; } @Override public void run() { int count = 0; while (true) { user.lock.lock();
try { if (user.flag) { condition.await(); } if (count % 2 == 0) { user.username = "cppdy"; user.sex = "nan"; } else { user.username = "吹泡泡的魚"; user.sex = "男"; } count++; // 將user標記變為可讀 user.flag = true; condition.signal(); } catch (Exception e) { e.printStackTrace(); } finally { user.lock.unlock(); } } } } class OutThread1 extends Thread { private User1 user; private Condition condition; public OutThread1(User1 user,Condition condition) { this.user = user; this.condition=condition; } @Override public void run() { while (true) { user.lock.lock(); try { if (!user.flag) { condition.await(); } System.out.println(user.username + "--" + user.sex); // 將user標記變為可寫 user.flag = false; condition.signal(); } catch (Exception e) { e.printStackTrace(); } finally { user.lock.unlock(); } } } } public class ThreadDemo14 { public static void main(String[] args) throws Exception { User1 user = new User1(); Condition condition=user.lock.newCondition(); InputThread1 it = new InputThread1(user,condition); OutThread1 ot = new OutThread1(user,condition); it.start(); ot.start(); } }

java多線程快速入門(十八)