方法一
从其题目中得输出要求,我们发现字母A,B,C```
的输出位置在整个序列中的位置是三的整数倍位置处,故在Printer类中定义的index是指在输出序列的索引。
package temp;
class Test
{
public static void main(String[] args)
{
Printer p = new Printer(); //这两个对象共享对象p
Thread t1 = new NumberPrinter(p);
Thread t2 = new LetterPrinter(p);
t1.start();
t2.start();
}
}
class Printer
{
private int index = 1;// 设为1,方便计算3的倍数
// 打印数字的构造方法,每打印两个数字,等待打印一个字母
public synchronized void print(int i)
{
while (index % 3 == 0)
{
try
{
wait();
}
catch (Exception e)
{
}
}
System.out.print(" " + i);
index++;
notifyAll();
}
// 打印字母,每打印一个字母,等待打印两个数字
public synchronized void print(char c)
{
while (index % 3 != 0)
{
try
{
wait();
}
catch (Exception e)
{
}
}
System.out.print(" " + c);
index++;
notifyAll();
}
}
// 打印数字的线程
class NumberPrinter extends Thread
{
private Printer p;
public NumberPrinter(Printer p)
{
this.p = p;
}
public void run()
{
for (int i = 1; i <= 52; i++)
{
p.print(i);
}
}
}
// 打印字母的线程
class LetterPrinter extends Thread
{
private Printer p;
public LetterPrinter(Printer p)
{
this.p = p;
}
public void run()
{
for (char c = 'A'; c <= 'Z'; c++)
{
p.print(c);
}
}
}
方法二
public class ThreadDemo
{
// 测试
public static void main(String[] args) throws Exception
{
Object obj = new Object();
// 启动两个线程
Thread1 t1 = new Thread1(obj);
Thread2 t2 = new Thread2(obj);
t1.start();
t2.start();
}
}
// 一个线程打印1-52
class Thread1 extends Thread
{
private Object obj;
public Thread1(Object obj)
{
this.obj = obj;
}
public void run()
{
synchronized (obj)
{
// 打印1-52
for (int i = 1; i < 53; i++)
{
System.out.print(i + " ");
if (i % 2 == 0)
{
// 不能忘了 唤醒其它线程
obj.notifyAll();
try
{
obj.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
}
// 另一个线程打印字母A-Z
class Thread2 extends Thread
{
private Object obj;
public Thread2(Object obj)
{
this.obj = obj;
}
public void run()
{
synchronized (obj)
{
// 打印A-Z
for (int i = 0; i < 26; i++)
{
System.out.print((char)('A' + i) + " ");
// 不能忘了 唤醒其它线程
obj.notifyAll();
try
{
// 最后一个就不要等了
if (i != 25)
{
obj.wait();
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}