package com.ygl;


public interface Output {

public void output(String str);
}
//**************************
package com.ygl;
public class Outputer implements Output{
public void output(String str){
int len=str.length();
synchronized(this) //或者用方法锁
{
for(int i=0;i<len;i++){
System.out.print(str.charAt(i));
}
System.out.println();
}
}
}或者
package com.ygl;


import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class Outputer implements Output{
Lock lock=new ReentrantLock();
public void output(String str){

int len=str.length();
lock.lock();
try{
for(int i=0;i<len;i++){
System.out.print(str.charAt(i));
}
System.out.println();
}finally{
lock.unlock();



}
}//************************************
package com.ygl;
public class MyRunnable implements Runnable{
private Output obj;
private String str;
public MyRunnable ( Output obj,String str){
this.obj=obj;
this.str=str;
}
public MyRunnable (){

}
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
obj.output(str);
}

}

}//*********************************
package com.ygl;


public class TraditionalThreadSynchronized {
public static void main(String[] args) {
Output output=new Outputer();
Runnable runnable1 =new MyRunnable(output,"ygl");
Runnable runnable2 =new MyRunnable(output,"liming");
Thread thread1=new Thread(runnable1);
thread1.start();
Thread thread2=new Thread(runnable2);
thread2.start();
}
}