标签:线程锁
实现两个线程,轮流打印出数字,如下:
bThread --> 10 aThread --> 9 bThread --> 8 aThread --> 7 bThread --> 6 aThread --> 5 bThread --> 4 aThread --> 3 bThread --> 2 aThread --> 1
package com.yjq.thread_demo; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class TwoThreadPrinter { private Lock threadLock = new ReentrantLock(); private boolean flag = false; int count =10; Thread aThread = new Thread(new Runnable() { public void run() { while (true) { // 锁定 threadLock.lock(); try { if ( count < 1) { return; } if (flag) { // aThread的任务 System.out.println("aThread --> " + (count--)); flag = !flag; } } catch (Exception e) { // TODO: handle exception } finally { // 释放锁 threadLock.unlock(); } } } }); Thread bThread = new Thread(new Runnable() { public void run() { while (true) { // 锁定 threadLock.lock(); try { if ( count < 1) { return; } if (!flag) { // aThread的任务 System.out.println("bThread --> " + (count--)); flag = !flag; } } catch (Exception e) { // TODO: handle exception } finally { // 释放锁 threadLock.unlock(); } } } }); public void startTwoThread() { aThread.start(); bThread.start(); } public static void main(String[] args) { TwoThreadPrinter twoThreadPrinter = new TwoThreadPrinter(); twoThreadPrinter.startTwoThread(); } }
package com.yjq.thread_demo; public class TwoThreadPrinter2 { private Object threadLock = new Object(); int count =10; Thread aThread = new Thread(new Runnable() { public void run() { while (true) { // 锁定 synchronized (threadLock) { if ( count < 1) { return; } // // aThread的任务 System.out.println("aThread --> " + (count--)); threadLock.notify(); try { threadLock.wait(); } catch (Exception e) { // TODO: handle exception } } } } }); Thread bThread = new Thread(new Runnable() { public void run() { while (true) { // 锁定 synchronized (threadLock) { if ( count < 1) { return; } // // aThread的任务 System.out.println("bThread --> " + (count--)); threadLock.notify(); try { threadLock.wait(); } catch (Exception e) { // TODO: handle exception } } } } }); public void startTwoThread() { aThread.start(); bThread.start(); } public static void main(String[] args) { TwoThreadPrinter twoThreadPrinter = new TwoThreadPrinter(); twoThreadPrinter.startTwoThread(); } }
用Lock类的方法比较容易理解, lock() 和 unlock()之前的块是被锁定的
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:线程锁
原文地址:http://blog.csdn.net/guige_csdn/article/details/47782633