`

StringBuffer类及线程运行测试

阅读更多
虽然平时常常看到,毕竟很少用。居然在笔试的时候碰到了,而且还写得不好,真是惭愧...

StringBuffer类,主要是insert(int,String/int/Object/...)与append(String/int/Object/...)两个方法;
最后用.toString()方法把缓冲区内的数据转换为字符串表示。

StringBuffer类的引用:http://www.leftworld.net/online/j2sedoc/javaref/java.lang.stringbuffer_dsc.htm

据说是线程安全的,不过测试了下,发现这个概念理解有出入,貌似每次的结果是有差别的。

public class A {

    public static StringBuffer bf=new StringBuffer();
    /**
     * @param args
     */
    public static void main(String[] args) {

        Thread a= new threadA();
        Thread b= new threadB();
        
        a.start();
        b.start();

        //System.out.println(A.bf.toString());
    }
}   

    class threadA extends Thread{
        public void run(){
            for(int i=1;i<=10;i++){
                A.bf.append(1);
                try {
                    sleep(10);
                } catch (InterruptedException e) {
                   continue;
                }
            }

            System.out.println(A.bf.toString());
        }
    }
    
    class threadB extends Thread{
        public void run(){
            for(int i=1;i<=10;i++){
                A.bf.append(2);
                try {
                    sleep(10);
                } catch (InterruptedException e) {
                    continue;
                }
            }

            System.out.println(A.bf.toString());
        }
    }


而且还发现了一个问题,若是用wait()来代替sleep()运行时报异常java.lang.IllegalMonitorStateException: current thread not owner,因为wait()方法会导致线程放弃对象锁,而该对象没有加锁。

还有一个问题,就是不知道如何在main函数中判断子线程的终止以打印最终结果。晚上回去研究下好了。

下面附阿润写的一个,使用回调函数来传递结果的例子。其实用join()方法就OK了。不过这里主要是为了看下回调函数,有点锁的感觉。

public class A {

	public static StringBuffer bf = new StringBuffer();

	public static int threadCount;

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		Thread a = new threadA();
		Thread b = new threadB();

		threadCount = 2;

		a.start();
		b.start();

		// System.out.println(A.bf.toString());
	}

	/**
	 * Each User's Thread call this method at the end of run()
	 */
	public static synchronized void callback() {
		--threadCount;
		if (threadCount <= 0) {
			System.out.println("Final Result: ");
			System.out.println(A.bf.toString());
			System.out.println("Program End...");
		}
	}
}

class threadA extends Thread {

	public void run() {
		for (int i = 1; i <= 10; i++) {
			A.bf.append(1);
			try {
				sleep(10);
			} catch (InterruptedException e) {
				continue;
			}
		}

		System.out.println(A.bf.toString());
		A.callback();
	}
}

class threadB extends Thread {

	public void run() {
		for (int i = 1; i <= 10; i++) {
			A.bf.append(2);
			try {
				sleep(10);
			} catch (InterruptedException e) {
				continue;
			}
		}

		System.out.println(A.bf.toString());
		A.callback();
	}
}
分享到:
评论

相关推荐

    Java开发技术大全(500个源代码).

    HelloNativeTest.java 测试本地化是否成功的类文件 instanceVar.java 定义一个实例成员变量 invokeByObject.java 对象实参传递示例程序 invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用...

    java初学者必看

    5.4 StringBuffer类操作 5.4.1 基本操作 5.4.2 字符串操作方法 5.4.3 添加append() 5.4.4 插入insert() 5.5 实例:字符串应用 5.6 本章习题 第6章 数组 6.1 一维数组 6.1.1 数组的概念 6.1.2 一维数组的...

    JAVA面试题最全集

    使用StringBuffer类与String类进行字符串连接时有何区别? 57.调用Thread类的destroy()方法有什么后果? 58.多线程,用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? 59.使用socket建立客户端...

    java 面试题 总结

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 14、Overload...

    JAVA基础课程讲义

    测试类的定义方式 57 简单的学生类编写示例 58 内存分析 59 属性(field,或者叫成员变量) 59 引用类型 60 类的方法 60 对象的创建和使用 60 构造器(或者叫做构造方法,constructor) 60 垃圾回收机制(Garbage ...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    10.3用StringBuffer类进行字符串处理 10.4基本数据类型的包装类 10.4.1认识包装类 10.4.2通过包装类进行数据转换 10.5认识Java集合 10.5.1为什么需要集合 10.5.2Java中的集合 10.6使用一维集合 10.6.1认识一...

    突破程序员基本功的16课.part2

    4.4.2 使用StringBuilder和StringBuffer进行字符串连接 4.4.3 尽早释放无用对象的引用 4.4.4 尽量少用静态变量 4.4.5 避免在经常调用的方法、循环中创建Java对象 4.4.6 缓存经常使用的对象 4.4.7 尽量不要使用...

    超级有影响力霸气的Java面试题大全文档

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...

    java编程基础,应用与实例

    1.3.2 安装开发文档及最终完成 5 1.3.3 Java开发工具 6 1.4 Java程序开发过程 7 1.5 运行第一个Java程序 7 1.6 巩固练习 8 第2章 理解对象与类 9 2.1 什么是对象 9 2.2 什么是类 9 2.3 HelloJava...

    javaSE代码实例

    13.3.2 编写方法链以及StringBuffer类的重要方法 255 13.4 StringBuilder类 258 13.5 正则表达式 259 13.5.1 正则表达式的基本语法 259 13.5.2 Pattern类简介 262 13.5.3 Matcher类简介 263 13.5.4 ...

    Thinking in Java 中文第四版+习题答案

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    Think in Java(中文版)chm格式

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架...

    Java的六大问题你都懂了吗

    它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法...

    JAVA_Thinking in Java

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    Java初学者入门教学

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    ThinkInJava

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    java 编程入门思考

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    thinkinjava

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

Global site tag (gtag.js) - Google Analytics