我想知道StringBuilder和amp;之间的区别StringBuffer类和它们的实际用途。所以,我写了2个代码片段,其中我同时产生了3个线程,这些线程使用了StringBuilder& StringBuffer对象。
当我运行代码时,我希望所有3个线程在StringBuilder&在StringBuffer的情况下以同步的方式。但在两种情况下,它们以同步的方式运行。 那么StringBuffer类的用途是什么?:confused:
(对于String对象,所有3个线程同时运行)。我将分享代码片段供您参考。如果我在理解多线程本身的概念时错了,请纠正我。还请,还要更正代码。
// StringBuilder...
public class MultiTread implements Runnable{
private StringBuilder name;
public MultiTread(StringBuilder string){
name=string;
}
public void run(){
for(int i=0; i<=10; i++){
System.out.println(name.append(i));
}
}
public static void main(String[] args){
Thread th = new Thread(new MultiTread(new StringBuilder("thread1:")));
Thread th1 = new Thread(new MultiTread(new StringBuilder("thread2:")));
Thread th2 = new Thread(new MultiTread(new StringBuilder("thread3:")));
th.start();
th1.start();
th2.start();
}
}
..................
//StringBuffer...
public class MultiTreadBuf implements Runnable{
private StringBuffer name;
public MultiTreadBuf(StringBuffer string){
name=string;
}
public void run(){
for(int i=0; i<=10; i++){
System.out.println(name.append(i));
}
}
public static void main(String[] args){
Thread th = new Thread(new MultiTreadBuf(new StringBuffer("thread1:")));
Thread th1 = new Thread(new MultiTreadBuf(new StringBuffer("thread2:")));
Thread th2 = new Thread(new MultiTreadBuf(new StringBuffer("thread3:")));
th.start();
th1.start();
th2.start();
}
}
........
//String....
public class MuiltiTreadStr implements Runnable{
private String name;
public MuiltiTreadStr(String string){
name=string;
}
public void run(){
for(int i=0; i<=10; i++){
System.out.println(name+i);
}
}
public static void main(String[] args){
System.out.println("main begins...");
Thread th = new Thread(new MuiltiTreadStr("thread1:"));
Thread th1 = new Thread(new MuiltiTreadStr("thread2:"));
Thread th2 = new Thread(new MuiltiTreadStr("thread3:"));
System.out.println("spawning 3 threads...");
th.start();
th1.start();
th2.start();
System.out.println("main ends...");
}
}
答案 0 :(得分:8)
每个线程使用不同的String Buffer和String Builders实例。要查看同步,必须在所有线程中使用相同的对象实例; - )
答案 1 :(得分:2)
对预期行为与实际行为的描述会有所帮助,但我猜你看到了每个线程的顺序输出,但预计会看到不同线程的输出交错。
线程调度取决于系统。无法保证线程将被公平调度(例如,具有相同优先级的线程获得“时间片”),或线程将同时运行,即使在多处理器系统上也是如此。
此外,请记住System.out.println()
已同步,并且无法保证公平锁定的争用或公平解决。因此,一个线程可能会重复获取System.out
上的锁定,而其他线程在该线程完成之前无法打印。您可以使用java.util.concurrent.ReentrantLock
来获得“公平”锁定(可能会造成性能损失)。
另一种可能性是你的系统速度太快,以至于一个线程在下一个线程尝试开始运行之前完成。更多的迭代将有助于检测这种情况。
答案 2 :(得分:0)
你应该为所有线程使用相同的StringBuilder / StingBuffer实例。这样你就可以看到同步。