class Alone extends Thread
{
static Object output=new Object();
int[] array;
static StringBuffer sb=new StringBuffer();
public Alone(int[] array)
{
this.array=array;
}
public void addLeft()
{
for(int i=0;i<array.length/2;i++)
{
sb.append(array[i]);
}
}
public void addRight()
{
for(int i=array.length/2;i<array.length;i++)
{
sb.append(array[i]);
}
}
public void run()
{
             addLeft();
               addRight();
}
public static void main(String[] args)
{
Alone a=new Alone(new int[]{1,1,1,1,2,2,2,2});
Alone b=new Alone(new int[]{3,3,3,3,4,4,4,4});
a.start();
b.start();
try
{
a.join();
b.join();
}
catch(InterruptedException e)
{
System.out.println(e.getMessage());
}
System.out.println(sb);
}
}
我想要的结果是:
情况1:1111333322224444
情况2:3333111144442222
我应该如何在run方法中定义同步呢?

解决方案 »

  1.   

    其实你只需要对sb对象进行同步即可。如果你想在run方法里进行同步的话可以先定义一个static final变量,然后同步这个变量即可。
      

  2.   

    你需要完成什么样的功能,没有描述,看了你写的这个测试,猜测:可能是:A对象放过之后,B接着放东西到同一个地方,然后又轮到A···
    按照偶自己的理解(也可能是曲解),按照你要的结果帮你修改了下:
    package com.syn;
    public class   Alone   extends   Thread 

    static   Object   output=new   Object(); 
    int[]   array; 
    static   StringBuffer   sb=new   StringBuffer(); 
    static boolean done=false;
    public   Alone(int[]   array) 

    this.array=array; 

    public  synchronized  void   addLeft() 
    { for(int   i=0;i <array.length/2;i++) 

    sb.append(array[i]); 

    try{
    Thread.sleep(200);
    }catch(Exception e){
       e.printStackTrace();
    }

    public  synchronized  void   addRight() 

    for(int   i=array.length/2;i <array.length;i++) 

    sb.append(array[i]); 

    try{
    Thread.sleep(200);
    }catch(Exception e){
       e.printStackTrace();
    }

    public   void   run() 

                             addLeft(); 
                               addRight(); 

    public   static   void   main(String[]   args) 

    Alone   a=new   Alone(new   int[]{1,1,1,1,2,2,2,2}); 
    Alone   b=new   Alone(new   int[]{3,3,3,3,4,4,4,4}); 
    a.start(); 
    b.start(); 
    try{
    Thread.sleep(5000);
    }catch(Exception e){
       e.printStackTrace();
    }
    System.out.println(sb);