写一个程序在多线程的帮助下打印表格创建三个线程分别命名为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();
}
}
以随机方式打印表。尽管我在所有的方法中都使用了synchronized。
同步方法将防止其他线程进入该方法所同步的对象上的同步块。在您的示例中,每个线程有两个方法,因此,例如,当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);
}
}
}