1. 程式人生 > >多執行緒同步之——兩個執行緒序列順序列印奇數和偶數的兩種實現

多執行緒同步之——兩個執行緒序列順序列印奇數和偶數的兩種實現

題目:一道經典的執行緒併發的問題,執行緒a列印1、3、5……,執行緒b列印2、4、6……,兩個執行緒交替執行輸出1、2、3、4、5、6……
要點:

package com.test;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * desc:Thread Counter
 */
public class Counter {

    private static
Lock lock = new ReentrantLock(); private static Condition conditionOne = lock.newCondition(); private static Condition conditionTow = lock.newCondition(); private static volatile boolean isFlag = false; private static Object object = new Object(); public static void main(String[] args) { System.out.println("Lock Condition:"
); methodOne(); System.out.println("synchronized wait notify"); methodTow(); } /** * lock and condition */ private static void methodOne() { Thread threadA = new Thread(new Runnable() { public void run() { int i = 1; while
(i <= 99) { if (!isFlag) { lock.lock(); try { System.out.println("threadA:" + i); isFlag = true; conditionOne.await(); conditionTow.signal(); i += 2; } catch (InterruptedException e) { e.printStackTrace(); } lock.unlock(); } } } }); Thread threadB = new Thread(new Runnable() { public void run() { int i = 2; while (i <= 100) { if (isFlag) { lock.lock(); try { System.out.println("threadB:" + i); isFlag = false; conditionOne.signal(); conditionTow.await(); i += 2; } catch (InterruptedException e) { e.printStackTrace(); } lock.unlock(); } } } }); threadA.setPriority(Thread.MAX_PRIORITY); try { threadB.start(); Thread.sleep(1000); threadA.start(); threadA.join(); threadB.join(); System.out.println("ok"); } catch (InterruptedException e) { e.printStackTrace(); } } /** * synchronized wait notify */ public static void methodTow() { Thread threadA = new Thread(new Runnable() { public void run() { int i = 1; while (i <= 99) { if (!isFlag) { synchronized (object) { System.out.println("threadA:" + i); i += 2; isFlag = true; try { if (i < 99) { object.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } object.notify(); } } } } }); Thread threadB = new Thread(new Runnable() { public void run() { int i = 2; while (i <= 100) { if (isFlag) { synchronized (object) { System.out.println("threadB:" + i); isFlag = false; i += 2; object.notify(); try { if (i < 100) { object.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } } } } } }); try { threadA.setPriority(Thread.MAX_PRIORITY); Thread.sleep(1000); threadB.start(); threadA.start(); threadA.join(); threadB.join(); System.out.println("ok"); } catch (InterruptedException e) { e.printStackTrace(); } } }