-1

StringBuffer可以处理多个线程synchronization如果您的文本可以更改,并且可以从多个线程访问,请使用 StringBuffer 因为StringBuffer是同步的。

谁能解释一下多线程什么时候发生?我们是在我们的程序实现中创建线程runnable interface or extending Thread class还是OS基于它?

4

4 回答 4

3

线程可以通过多种方式发生。如果您正在创建线程(例如extends Thread),或者您正在创建传递给某种线程模型的对象(例如implements Runnable),或者即使您只是在某处有处理类似事件的代码(例如回调函数)。如何创建线程并不重要。无论如何,当你有这样的事情时:

public String someMethod()
{
    StringBuilder b = new StringBuilder();
    b.append("Some Method");
    return(b.toString());
}

你知道那是线程安全的。StringBuilder对'方法的任何访问append()都不需要同步。但是,如果你有这样的事情(只是一个例子):

public class Test
{
    StringBuffer b;

    public Test()
    {
        b = new StringBuffer();
    }

    public String someMethod()
    {
        b.append("Some Method");
        return(b.toString());
    }
}

在这里,您可以看到不止一个执行“线程”可以调用someMethod(),并且由于它们都可以访问StringBuffer,因此需要对其进行同步。可能是在任何给定时间只有一个线程调用该方法,但这种编写方式并不禁止 2 个线程同时调用它。如果StringBuilder使用 a (不是线程安全的),您可能会遇到问题。

于 2013-01-28T06:13:03.227 回答
2

它是'implementing runnable'或者'extending Thread'

如果资源(此处StringBuffer)在多个线程(java进程)之间共享/假设StringBuffer在非监控范围内(即外部synchronize{}块)定义

在这种情况下,多个线程将不会在队列中等待访问StringBuffer实例,因为没有监视器/或需要获取锁来修改实例。

有关java 并发的更多信息

于 2013-01-28T06:05:02.240 回答
2

让我们假设您的程序无法同时执行两个不同的操作/事件。那你需要考虑一下Threads。从逻辑的角度来看,multithreading意味着一个程序的多行。在这种情况下,操作系统将程序视为两个独立且不同的进程

Java 的创造者慷慨地设计了两种创建线程的方法:implementing an interface and extending a class. 一个简单的案例是当您拥有一个日志文件并且多个线程正在记录and写入该日志文件的错误或警告时。

狗的嗅觉是polymorphic。如果狗闻到猫的气味,它会吠叫并追赶它。如果狗闻到食物的味道,它会流口水并跑到它的碗里。嗅觉在这两种情况下都在起作用。区别在于嗅到的是什么,也就是狗的鼻子操作的数据类型!

让我们举个例子:

// 这是我们的主类。

class ThreadTest2 {
    public static void main(String args[]){

        Thread thread1 = new Thread(new MyClass("thread1: "));
        Thread thread2 = new Thread(new MyClass("thread2: "));

        thread1.start();
        thread2.start();

        boolean thread1IsAlive = true;
        boolean thread2IsAlive = true;

        do {
            if (thread1IsAlive && !thread1.isAlive()) {
                thread1IsAlive = false;
                System.out.println("Thread 1 is dead.");
            }

            if (thread2IsAlive && !thread2.isAlive()) {
                thread2IsAlive = false;
                System.out.println("Thread 2 is dead.");
            }
        } while (thread1IsAlive || thread2IsAlive);

    }

}

// 这是我们实现可运行接口的类。

class MyClass implements Runnable {
    static String message[] = { "Java", "is", "hot,", "aromatic"};
    String name;

    public MyClass(String id){
        name = id;
    }

    public void run(){

        for(int i=0;i<message.length;++i) {
            randomWait();
            System.out.println(name+message[i]);
        }
    }

    void randomWait(){
        try {
            Thread.currentThread().sleep((long)(3000*Math.random()));
        } catch (InterruptedException x) {
            System.out.println("Interrupted!");
        }
    }
}

该程序thread1 and thread2从 MyThread 类创建两个执行线程。然后它启动两个线程并执行等待线程终止的 do 语句。线程显示 Java 是热的、芳香的。一个字一个字地发送消息,同时在每个字之间等待一小段随机的时间。Because both threads share the console window,程序的输出标识了哪些线程能够在程序执行期间的不同时间写入控制台。

于 2013-01-28T08:23:11.437 回答
1

例如,您需要通过接口或类显式创建额外Thread的,Runnable以便Thread多线程成为关注点。这也适用于Java EEJVM 创建额外线程的某些情况。

如果OS在后台使用额外的线程,它而不是你,负责线程安全,所以你不需要担心。

您可以在 Java 教程的并发部分阅读更多内容。

于 2013-01-28T06:07:35.063 回答