1.有A、B、C、D四個線程,A線程輸出A, B線程輸出B, C線程輸出C,D線程輸出D,要求, 同時啓動四個線程, 按順序輸出ABCD;
本題主要通過join方法來實現順序輸出ABCD。
代碼如下:
package thread;
/**
* @author Beauxie
*/
public class TestThread1 {
public static void main(String[] args) {
// 線程A
final Thread a = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("A");
}
});
// 線程B
final Thread b = new Thread(new Runnable() {
@Override
public void run() {
try {
// 執行b線程之前,加入a線程,讓a線程執行
a.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("B");
}
});
// 線程C
final Thread c = new Thread(new Runnable() {
@Override
public void run() {
try {
// 執行c線程之前,加入b線程,讓b線程執行
b.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("C");
}
});
// 線程D
Thread d = new Thread(new Runnable() {
@Override
public void run() {
try {
// 執行d線程之前,加入c線程,讓c線程執行
c.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("D");
}
});
// 啓動四個線程
a.start();
b.start();
c.start();
d.start();
}
}
運行結果:
2.有A,B,C三個線程, A線程輸出A, B線程輸出B, C線程輸出C 要求, 同時啓動三個線程, 按順序輸出ABC, 循環10次;
代碼如下:
package thread;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author Beauxie
*/
public class TestThresd2 {
// //通過JDK5中的鎖來保證線程的訪問的互斥
private static Lock lock = new ReentrantLock();
private static int state = 0;// 用state來判斷輪到誰執行
private static final int RUN_NUMBER=100;//表示循環的次數
//A線程
static class ThreadA extends Thread {
@Override
public void run() {
for (int i = 0; i < RUN_NUMBER;) {
lock.lock();//獲取鎖定
if (state % 3 == 0) {
System.out.println("第"+(i+1)+"次:");
System.out.println("A");
state++;
i++;
}
lock.unlock();//釋放鎖定,不釋放鎖定,會被該線程一直保持
}
}
}
//B線程
static class ThreadB extends Thread {
@Override
public void run() {
for (int i = 0; i < RUN_NUMBER;) {
lock.lock();
if (state % 3 ==1) {
System.out.println("B");
state++;
i++;
}
lock.unlock();
}
}
}
//C線程
static class ThreadC extends Thread {
@Override
public void run() {
for (int i = 0; i < RUN_NUMBER;) {
lock.lock();
if (state % 3 == 2) {
System.out.println("C");
state++;
i++;
}
lock.unlock();
}
}
}
public static void main (String[] args){
new ThreadA().start();
new ThreadB().start();
new ThreadC().start();
}
}
在這裏我將循環次數改成100次,運行結果:
本題參考自:http://love3400wind.blog.163.com/blog/static/796308012013117102941831/
如果各位有更好的思路,麻煩請告訴我,謝謝!