交替打印
创建两个线程,其中一个输出1-52,另外一个输出A-Z。输出格式要求:12A 34B 56C 78D
package com.bonc;
// 思考:如何保证主线程最后的结束而非阻塞?
//注意: notifyall()的位置在当前线程wait()的前面
public class ThreadTest {
// 这个类相当于共享变量
//同步监视器类,提供线程安全的方法
class printResult{
private int number = 1;
private char character = 'A';
//提供两个synchronized方法
// synchronized方法 ;notifyall()的位置在当前线程wait()的前面
public synchronized void printNumber(){
System.out.print(number+""+(number+1));
number+=2;
notifyAll();
try {
// 大于52之后不再等待;
if (number <= 52) wait();
//使用while(number <= 52) wait();会一直循环,后面notify也跳不出来
}catch (Exception e){
System.out.println(e);
}
}
public synchronized void printCharacter(){
System.out.println(character + " ");
character+=1;
notifyAll();
try {
// 大于Z之后不再等待;如果不加最后不会结束!!阻塞了
if (character<='Z') wait();
}catch (Exception e ){
System.out.println(e);
}
}
}
class Number implements Runnable{
private printResult printResult;
public Number(printResult p){
this.printResult=p;
}
private int i=0;
@Override
public void run() {
for (;i<26;i++){
//调用同步监视器中的方法
printResult.printNumber();
//System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
class Character implements Runnable{
private printResult printResult;
public Character(printResult p){
this.printResult = p;
}
@Override
public void run() {
for (int i = 0; i < 26; i++) {
printResult.printCharacter();
}
}
}
public static void main(String[] args) {
ThreadTest threadTest = new ThreadTest();
printResult printResult = threadTest.new printResult();
Number number = threadTest.new Number(printResult);
Character character = threadTest.new Character(printResult);
// 启动两个线程,一个输出数字、一个输出字母
new Thread(number,"线程0").start();
new Thread(character,"线程1").start();
try {
//希望 子线程在start就绪后立即启动,那么可以将主线程sleep 15毫秒
Thread.sleep(50);
}catch (Exception e){
System.out.println(e);
}
}
}