Java_多线程_编写两个线程,一个线程打印1-52的整数,另一个线程打印字母A-Z。打印顺序为12A34B56C….5152Z

答案1

package cn.thread3;

/**
 * 编写两个线程,一个线程打印1-52的整数,另一个线程打印字母A-Z。
 * 打印顺序为12A34B56C….5152Z。
 * 即按照整数和字母的顺序从小到大打印,并且每打印两个整数后,打印一个字母,
 * 交替循环打印,直到打印到整数52和字母Z结束
 * @author Chill Lyn
 *
 */
public class TestNumLetterPrinter {
	public static void main(String[] args) {
		Printer p = new Printer();
		new Thread(new NumberPrinter(p)).start();
		new Thread(new LetterPrinter(p)).start();
	}
}

//编写打印类Printer,声明私有属性index,初始值为1,用来表示是第几次打印
class Printer {
	private int index = 1;

//	编写打印数字的方法print(int i),3的倍数就使用wait()方法等待,否则就输出i,使用notifyAll()进行唤醒其它线程。
	public synchronized void print(int i) throws InterruptedException {
		while (index % 3 == 0) {
			wait();
		}
		System.out.print(i);
		index++;
		notifyAll();

	}

//	编写打印字母的方法print(char c),不是3的倍数就等待,否则就打印输出字母c,使用notifyAll()进行唤醒其它线程
	public synchronized void print(char c) throws InterruptedException {
		while (index % 3 != 0) {
			wait();
		}
		System.out.print(c);
		index++;
		notifyAll();

	}
}

//编写打印数字的线程NumberPrinter实现Runnable接口,
//声明私有属性private Printer p;在构造方法中进行赋值,实现父类的run方法,调用Printer类中的输出数字的方法 
class NumberPrinter implements Runnable {
	private Printer p;

	public NumberPrinter(Printer p) {
		this.p = p;
	}

	@Override
	public void run() {
		for (int i = 1; i < 53; i++) {
			try {
				p.print(i);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

//编写打印字母的线程LetterPrinter实现Runnable接口,
//声明私有属性private Printer p;在构造方法中进行赋值,实现父类的run方法,调用Printer类中的输出字母的方法
class LetterPrinter implements Runnable {
	private Printer p;

	public LetterPrinter(Printer p) {
		this.p = p;
	}

	@Override
	public void run() {
		for (int i = 1; i < 27; i++) {
			try {
				p.print((char) (i + 96));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

答案2

package cn.thread3;

/**
 * 编写两个线程,一个线程打印1-52的整数,另一个线程打印字母A-Z。
 * 打印顺序为12A34B56C….5152Z。
 * 即按照整数和字母的顺序从小到大打印,并且每打印两个整数后,打印一个字母,
 * 交替循环打印,直到打印到整数52和字母Z结束
 * @author Chill Lyn
 *
 */
public class TestNumLetterPrinter2 {
	public static void main(String[] args) {
		Printer2 p = new Printer2();
		new Thread(new NumberPrinter2(p)).start();
		new Thread(new LetterPrinter2(p)).start();
	}
}

//编写打印类Printer,声明私有属性index,初始值为1,用来表示是第几次打印
class Printer2 {
	private int index = 1;

//	编写打印数字的方法print(int i),3的倍数就使用wait()方法等待,否则就输出i,使用notifyAll()进行唤醒其它线程。
	public void print(int i) throws InterruptedException {
		while (index % 3 == 0) {
			wait();
		}
		System.out.print(i);
		index++;
		notifyAll();

	}

//	编写打印字母的方法print(char c),不是3的倍数就等待,否则就打印输出字母c,使用notifyAll()进行唤醒其它线程
	public void print(char c) throws InterruptedException {
		while (index % 3 != 0) {
			wait();
		}
		System.out.print(c);
		index++;
		notifyAll();

	}
}

//编写打印数字的线程NumberPrinter实现Runnable接口,
//声明私有属性private Printer p;在构造方法中进行赋值,实现父类的run方法,调用Printer类中的输出数字的方法 
class NumberPrinter2 implements Runnable {
	private Printer2 p;

	public NumberPrinter2(Printer2 p) {
		this.p = p;
	}

	@Override
	public void run() {
		synchronized (p) {
			for (int i = 1; i < 53; i++) {
				try {
					p.print(i);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

//编写打印字母的线程LetterPrinter实现Runnable接口,
//声明私有属性private Printer p;在构造方法中进行赋值,实现父类的run方法,调用Printer类中的输出字母的方法
class LetterPrinter2 implements Runnable {
	private Printer2 p;

	public LetterPrinter2(Printer2 p) {
		this.p = p;
	}

	@Override
	public void run() {
		synchronized (p) {
			for (int i = 1; i < 27; i++) {
				try {
					p.print((char) (i + 96));
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

你可能感兴趣的:(Java_多线程)