java多線程順序執行並順序輸出ABC問題


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/


如果各位有更好的思路,麻煩請告訴我,謝謝!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章