多執行緒程式設計題目
阿新 • • 發佈:2018-11-19
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();
}
}
結果如題目所要求