package practice;
public class T1 {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new MyThread("a"));
Thread t2 = new Thread(new MyThread("b"));
Thread t3 = new Thread(new MyThread("c"));
t1.start();
t1.join();
t2.start();
t2.join();
t3.start();
t3.join();
}
static class MyThread implements Runnable {
String str;
public MyThread(String str) {
this.str = str;
}
@Override
public void run() {
System.out.println(str);
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(str + "end");
}
}
}
2 三個(gè)線程順序打出abc 30次[Semaphore]
package practice;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicInteger;
public class T1 {
static AtomicInteger count = new AtomicInteger(0);
public static void main(String[] args) throws InterruptedException {
Semaphore sem_a = new Semaphore(0);
Semaphore sem_b = new Semaphore(0);
Semaphore sem_c = new Semaphore(0);
Thread t1 = new Thread(new MyThread("a", sem_a, sem_b));
Thread t2 = new Thread(new MyThread("b", sem_b, sem_c));
Thread t3 = new Thread(new MyThread("c", sem_c, sem_a));
t1.start();
t2.start();
t3.start();
sem_a.release();
}
static class MyThread implements Runnable {
String str;
Semaphore self, next;
public MyThread(String str, Semaphore selft, Semaphore next) {
this.str = str;
this.self = selft;
this.next = next;
}
@Override
public void run() {
while (true) {
try {
self.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
count.addAndGet(1);
if (count.get() / 10 >= 3) {
next.release();
break;
} else {
System.out.println(count.get() + ":" + str);
next.release();
}
}
}
}
}
3 三個(gè)線程順序打出abc 30次[Synchronized, wait, notifyall]
package practice;
public class T2 {
static int count = 0;
static int currentIndex = 0;
public static void main(String[] args) {
Object lock = new Object();
Thread t1 = new Thread(new MyThread(lock, 0, "a"));
Thread t2 = new Thread(new MyThread(lock, 1, "b"));
Thread t3 = new Thread(new MyThread(lock, 2, "c"));
t1.start();
t2.start();
t3.start();
}
static class MyThread implements Runnable {
Object lock;
int index;
String string;
public MyThread(Object lock, int index, String str) {
this.lock = lock;
this.index = index;
this.string = str;
}
@Override
public void run() {
while (true) {
synchronized (lock) { //gain the lock
while (index != currentIndex && count <= 29) {// if it is not, release the lock.
try {
lock.wait(); // The current thread must own this object's monitor, that's why it is in synchronized block
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//gained the lock and do the business
if (count > 29) {
lock.notifyAll();
break;
}
System.out.println(count + ":" + string);
count++;
currentIndex = (currentIndex + 1) % 3;
lock.notifyAll();// let's ask for the lock together. A thread waits on an object's monitor by calling one of the wait methods.
}
}
}
}
}
3 三個(gè)線程順序打出abc 30次[Lock, Condition]
package practice;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//Condition 實(shí)現(xiàn)可以提供不同于 Object 監(jiān)視器方法的行為和語(yǔ)義,比如受保證的通知排序,或者在執(zhí)行通知時(shí)不需要保持一個(gè)鎖。
public class T3 {
static ReentrantLock lock = new ReentrantLock();
static Condition cona = lock.newCondition();
static Condition conb = lock.newCondition();
static Condition conc = lock.newCondition();
static int count = 0;
static int currentIndex = 0;
public static void main(String[] args) {
Thread threada = new Thread(new MyThread(lock, cona, conb, "a", 0));
Thread threadb = new Thread(new MyThread(lock, conb, conc, "b", 1));
Thread threadc = new Thread(new MyThread(lock, conc, cona, "c", 2));
threada.start();
threadb.start();
threadc.start();
}
static class MyThread implements Runnable {
Condition self, next;
String str;
int index;
Lock lock;
public MyThread(Lock lock, Condition self, Condition next, String str, int index) {
this.lock = lock;
this.self = self;
this.next = next;
this.str = str;
this.index = index;
}
@Override
public void run() {
while (true) {
try {
lock.lock();
while (index != currentIndex && count < 30) {
try {
self.await(); //與此 Condition 相關(guān)的鎖以原子方式釋放,并且出于線程調(diào)度的目的,將禁用當(dāng)前線程. 但是可能出現(xiàn)虛假喚醒,所以還是while
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (count >= 30) {
next.signal();
break;
}
System.out.println(count + ":" + str);
count++;
currentIndex = (currentIndex + 1) % 3;
next.signal();
} finally {
lock.unlock();
}
}
}
}
}
最后編輯于 :2017.12.11 07:08:16
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者 【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。 平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。