1. 程式人生 > >多執行緒程式設計題目

多執行緒程式設計題目

1.現在有T1、T2、T3三個執行緒,你怎樣保證T2在T1執行完後執行,T3在T2執行完後執行?

// 建立執行緒物件,執行列印方法	
private static class ForthObject extends Thread{

	public ForthObject(String name){
        super(name);
    }
    @Override
    public void run(){
        for(int i=0;i<5;i++){
            System.out.println(this.getName() + ":" + i);
        }
    }
}

// 主執行緒中使用
public class Test {

	public static void main(String[] args) {
		
		// 現在有T1、T2、T3三個執行緒,你怎樣保證T2在T1執行完後執行,T3在T2執行完後執行?
		ForthObject p1 = new ForthObject("1");
		ForthObject p2 = new ForthObject("2");
		ForthObject p3 = new ForthObject("3");
		
		try {
			//
			p1.start();
			p1.join();
			p2.start();
			p2.join();
			p3.start();
			p3.join();
			
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

注意:需要先呼叫start方法後呼叫join方法;p1執行緒呼叫join方法後就會先執行p1執行緒的方法

結果如下:

1:0
1:1
1:2
1:3
1:4
2:0
2:1
2:2
2:3
2:4
3:0
3:1
3:2
3:3
3:4

 

2.兩個執行緒輪流列印數字,一直到100

// 建立物件,
// 分別建立兩個方法,我們使用flag來控制執行print1方法還是print2方法
private static class SecondObject{
	private static boolean flag = true;
	private int count = 0;
	
	public synchronized void print1(){
		for (int i = 1; i <= 50; i++) {
			if(!flag){
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			System.out.print(++count);
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			flag = !flag;
			
			this.notifyAll();
		}
	}
	
	public synchronized void print2(){
		for (int i = 1; i <= 50; i++) {
			if(flag){
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			System.out.print(++count);
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			flag = !flag;
			
			this.notifyAll();
		}
	}
}


public class Test {

	public static void main(String[] args) {
		
		
		// 2.兩個執行緒輪流列印數字,一直到100
		SecondObject so = new SecondObject();
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				so.print1();
			}
		}).start();
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				so.print2();
			}
		}).start();

	}
}

結果如題目所要求,輪詢列印

 

3.寫兩個執行緒,一個執行緒列印1~52,另一個執行緒列印A~Z,列印順序是12A34B...5152Z

// 寫一個類,分別列印字母和數字
// 兩個方法通過flag來控制列印
private static class MyObject{
	private static boolean flag = true;
	private int count = 0;
	// 寫數字
	public synchronized void printNum(){
	
		for (int i = 0; i < 52; i++) {
			
			// 預設為true,所以讓其先列印
			if(!flag){
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			System.out.print(++count);
			System.out.print(++count);
			
			// 喚醒printChar
			flag = !flag;
			this.notifyAll();
		}
	}
	
	// 寫字母
	public synchronized void printChar(){
		
		for (int i = 0; i < 26; i++) {
			
			// 預設為true,所以讓其後列印
			if(flag){
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			System.out.print((char)(65+i));
			
			// 喚醒printNum
			flag = !flag;
			this.notifyAll();
		}
		
	}
}


// 執行main方法
public class Test {

	public static void main(String[] args) {
		
		// 1.寫兩個執行緒,一個執行緒列印1~52,另一個執行緒列印A~Z,列印順序是12A34B...5152Z
		MyObject m = new MyObject();
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				m.printNum();
			}
		}).start();
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				m.printChar();
			}
		}).start();
    }
}

結果如題目所要求

 

4.編寫一個程式,啟動三個執行緒,三個執行緒的ID分別是A,B,C;,每個執行緒將自己的ID值在螢幕上列印5遍,列印順序是ABCABC...

// 建立物件,分別列印A B C
// 我們通過flag來控制執行哪個方法
private static class ThirdObject{
	
	private volatile int flag = 1;
	
	public synchronized void printA(){
		for (int i = 0; i < 5; i++) {
			
			// 如果不為1 ,說明還沒有輪到當前執行緒執行方法,則進入wait方法,釋放物件鎖
			if(flag != 1){
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			System.out.print("A ");
			
			// 下一個應該printB方法來執行
			flag = 2;
			this.notifyAll();
		}
	}
	
	public synchronized void printB(){
		for (int i = 0; i < 5; i++) {
			
			// 如果不為2 ,說明還沒有輪到當前執行緒執行方法,則進入wait方法,釋放物件鎖
			if(flag != 2){
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			System.out.print("B ");
			
			// 下一個應該printC方法來執行
			flag = 3;
			this.notifyAll();
		}
	}
	
	public synchronized void printC(){
		for (int i = 0; i < 5; i++) {
			
			// 如果不為3 ,說明還沒有輪到當前執行緒執行方法,則進入wait方法,釋放物件鎖
			if(flag != 3){
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			System.out.print("C ");
			
			// 下一個應該printA方法來執行
			flag = 1;
			this.notifyAll();
		}
	}
}

// 執行main方法
public class Test {

	public static void main(String[] args) {
		
		
		// 3.編寫一個程式,啟動三個執行緒,三個執行緒的ID分別是A,B,C;,每個執行緒將自己的ID值在螢幕上列印5遍,列印順序是ABCABC...
		ThirdObject to = new ThirdObject();
		new Thread(new Runnable() {
					
			@Override
			public void run() {
				to.printA();
			}
		}).start();
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				to.printB();
			}
		}).start();
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				to.printC();
			}
		}).start();
    }
}

結果如題目所要求