使用三个线程实现ABCABC……循环。
代码如下:
//标记类,用来让三个线程共享,同时也是三个线程中同步代码快的标记对象。
//之前这个标记我设置成Integer,但是发现Integer进行加法运算时会改变对
//象引用(原因是自动装箱),因此出现异常抛出。所以索性自己定义Flag类。
class Flag{
int i=0;
public synchronized void setI()
{
i++;
if(i==3)
i=0;
}
}
//输出A的线程
class SafeTestA implements Runnable{
int num=10;
Flag flag;
public SafeTestA(Flag flag)
{
this.flag=flag;
}
public void run()
{
synchronized(flag){
while(true)
{
if(flag.i==0){
System.out.println("A");
flag.setI();
flag.notifyAll();
}else{
try {
flag.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
/*public static void main(String[] args) {
Runnable sf=new SafeTest();
new Thread(sf).start();
new Thread(sf).start();
new Thread(sf).start();
}*/
}
//输出B的线程:
class SafeTestB implements Runnable{
Flag flag;
public SafeTestB(Flag flag)
{
this.flag=flag;
}
public void run()
{
while(true)
{
synchronized(flag){
while(true)
{
if(flag.i==1){
System.out.println("B");
flag.setI();
flag.notifyAll();
}else{
try {
flag.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
}
//输出C的线程
public class SafeTestC implements Runnable{
Flag flag;
public SafeTestC(Flag flag)
{
this.flag=flag;
}
public void run()
{
synchronized(flag){
while(true)
{
if(flag.i==2){
System.out.println("C");
flag.setI();
flag.notifyAll();
}else{
try {
flag.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
Flag flag=new Flag();
new Thread(new SafeTestA(flag)).start();
new Thread(new SafeTestB(flag)).start();
new Thread(new SafeTestC(flag)).start();
}
}
最关键的问题在于三个线程间的通信问题,是通过flag对象来标记的,之前出错是因为使用Integer来作为标记。这个例子也很好的给出了同步代码块的使用方法。
我的这个代码有累赘的部分,三个线程类其实可以用一个来实现更简洁。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-10 08:07:43