A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗磊 中级黑马   /  2012-8-22 11:54  /  1371 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class ThreadTests {
        
        public static void main(String[] args) {
                StringBuilders sb = new StringBuilders();
                new Thread(new Tisk1(sb), "存").start();;
                new Thread(new Tisk2(sb), "取").start();

        }
}
class StringBuilders{
        StringBuilder sb = new StringBuilder();
        Boolean flog = false;
        public void add(){
                while(flog){
                        synchronized (sb) {
                                for (int x = 0; x < 10; x++) {//向缓冲区中添加东西
                                        sb.append(x+",");
                                }
                                flog = true;
                        }
                        
                }
               
        }
        public void get(){

                while (!flog) {
                        synchronized (sb) {
                                System.out.println(sb.toString());//从缓冲区中取东西
                                flog = false;
                        }
                }
        }
}
class Tisk1 implements Runnable{//实现添加操作
        private StringBuilders sb;
        Tisk1(StringBuilders sb){
                this.sb = sb;
        }
        
        public void run(){
                        sb.add();
               
        }
}
class Tisk2 implements Runnable{//实现读取操作
        private StringBuilders sb;
        Tisk2(StringBuilders sb){
                this.sb = sb;
        }
        
        public void run(){
                        sb.get();
        }
}
Eclipse下为何输出结果一片空白,求解!

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1

查看全部评分

3 个回复

倒序浏览
同步代码块,不需要再用旗标来控制多线程轮换

一直输出空白是因为add的时候先判断flag,默认为false,就加不进去
get的时候,!flag默认为ture,所以就不停的输出sb的初值,当然就是空字符串了

解决办法:while(flag/!flag)都改成whie(true)

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1

查看全部评分

回复 使用道具 举报
public class ThreadTests {
         public static void main(String[] args) {
         StringBuilders sb = new StringBuilders();
         new Thread(new Tisk1(sb), "存").start();;
         new Thread(new Tisk2(sb), "取").start();

}
}
class StringBuilders{
StringBuilder sb = new StringBuilder();
Boolean flog = true;//标记改动
public void add(){
         while(flog){
                 synchronized (sb) {
                         for (int x = 0; x < 10; x++) {//向缓冲区中添加东西
                                 sb.append(x+",");
                         }
                         flog = false;//标记改动
                        
                 }
                 
         }
         
}
public void get(){

         while (!flog) {
                 synchronized (sb) {
                         System.out.println(sb.toString());//从缓冲区中取东西
                         flog = true;//标记改动
                 }
         }
}
}
class Tisk1 implements Runnable{//实现添加操作
private StringBuilders sb;
Tisk1(StringBuilders sb){
         this.sb = sb;
}

public void run(){
                 sb.add();
         
}
}
class Tisk2 implements Runnable{//实现读取操作
private StringBuilders sb;
Tisk2(StringBuilders sb){
         this.sb = sb;
}

public void run(){
                 sb.get();
}


}
注意下标记,你标记错了,我帮你调整了下标记,你再试试

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
诶咿呀,太粗心啦,我自己检查好几遍都没发现,多谢,解决啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马