撰寫一個程式來列印表格,借助多執行緒創建三個執行緒,分別命名為 T1、T2 和 T3。T1執行緒列印11和12的表格,T2列印13和14的表格,T3列印15和16的表格。任何執行緒都可以先啟動,但是一旦任何一個執行緒開始列印任意數量的表格,就不允許列印不同的表格由另一個執行緒。例如,假設執行緒 t3 首先啟動并開始列印 15 個表,直到 15 個表完成,沒有人列印另一個表。一旦 15 個表的列印結束,任何一個都可以列印另一個表。
class A implements Runnable{
public void run(){
first();
second();
}
synchronized public void first(){
for(int i=0;i<=10;i ){
System.out.println("Table of 11 is " 11*i);
}
}
synchronized public void second(){
for(int i=0;i<=10;i ){
System.out.println("Table of 12 is " 12*i);
}
}
}
class B implements Runnable{
public void run(){
third();
fourth();
}
synchronized public void third(){
for(int i=0;i<=10;i ){
System.out.println("Table of 13 is " 13*i);
}
}
synchronized public void fourth(){
for(int i=0;i<=10;i ){
System.out.println("Table of 14 is " 14*i);
}
}
}
class C implements Runnable{
public void run(){
fifth();
sixth();
}
synchronized public void fifth(){
for(int i=0;i<=10;i ){
System.out.println("Table of 15 is " 15*i);
}
}
synchronized public void sixth(){
for(int i=0;i<=10;i ){
System.out.println("Table of 16 is " 16*i);
}
}
}
public class threading3 {
public static void main(String args[]){
A a1=new A();
B b1=new B();
C c1=new C();
Thread t1=new Thread(a1);
Thread t2=new Thread(b1);
Thread t3=new Thread(c1);
t1.start();
t2.start();
t3.start();
}
}
它以隨機方式列印表。即使我在所有方法中都使用了同步。
uj5u.com熱心網友回復:
同步方法將阻止其他執行緒進入與該方法同步的同一物件上的同步塊。在您的示例中,每個執行緒都有兩種方法,例如,在first
運行時,second
無法運行,但沒有什么可以阻止third
運行。
您需要同步同一物件上的所有方法:
Object s=new Object();
A a1=new A(s);
B b1=new B(s);
C c1=new C(s);
class A implements Runnable{
Object s;
public A(s Object) {
this.s=s;
}
public void first(){
synchronized(s) {
for(int i=0;i<=10;i ){
System.out.println("Table of 13 is " 13*i);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/470125.html