免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2729 | 回复: 5
打印 上一主题 下一主题

一个多线程问题: 变量内容混乱 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-09 10:25 |只看该作者 |倒序浏览
我写了一个主程序, 其中启动三个线程, 主程序和每个线程都要记录自己的运行情况(分别写入不同的文件), 即它们都使用了一个叫 LogUtil的对象.

但通过LOG文件发现, 文件中记录的内容发生了混乱, 即应该出现在文件1中的内容出现在了文件3中等等.

我的问题是: 在多线程程序中, 若在主程序中声明了一个对象, 而线程中再次声明该对象(变量名与主程序的不相同!!), 它是否会从主程序中继承过来? 而且可以修改其属性的值?

谢谢!

论坛徽章:
0
2 [报告]
发表于 2005-05-09 12:37 |只看该作者

一个多线程问题: 变量内容混乱

使用锁定机制,即在读写时对文件锁定

论坛徽章:
0
3 [报告]
发表于 2005-05-09 13:08 |只看该作者

一个多线程问题: 变量内容混乱

如果是三个线程复用一个LogUtil类型的对象,同时这个LogUtil只能handle一个文件的话,很容易出现这个问题。你的程序是怎么写的?能看一下么?

论坛徽章:
0
4 [报告]
发表于 2005-05-10 11:48 |只看该作者

一个多线程问题: 变量内容混乱

不过我想我在每个线程里都声明了一次LogUtil对象,应该每个都独立的.
LogUtil如下:
import java.text.*;
import java.util.*;
import java.io.*;
import java.lang.*;

public class LogUtil
{
        private static long maxFileSize        = 1024000;
        private static String logFile        = "log";       
        private static String sHint                ="";
    private static StringBuffer strLog;
   
    public LogUtil( )
    {
        strLog = new StringBuffer();
    }
    public void newLog( )
    {
        strLog = new StringBuffer();
    }
    public void appendLog( String sLog)
    {
        strLog.append( sLog );
    }
    public void appendLog( StringBuffer sbLog)
    {
        strLog.append( sbLog );
    }
        public static void setMaxFileSize(long fileSize)
        {
                maxFileSize = fileSize;
        }

        public static void setLogFile(String fileName)
        {
                logFile         = fileName;
        }
       
        public static String getHint()
        {
                return sHint;
        }

        public static boolean writeLog( )
        {
        return writeLog( strLog.toString() );
    }
        public static boolean writeLog( StringBuffer sbLog )
        {
        return writeLog( sbLog.toString() );
    }
        public static boolean writeLog( String sLog )
        {
                try
                {
                        File fObj=new File( logFile + ".log";
                        File fTarget;
                        long lFileSize=fObj.length();
                        PrintWriter pw;
                        //rewrite log file from the first day of a month and file size >; maxFileSize
                        if ( DateUtil.getTime(.equals("1" || lFileSize >; maxFileSize )
                        {
                                fObj.renameTo( fTarget = new File( logFile + DateUtil.getTime(4) + ".log");
                                pw = new PrintWriter(new FileWriter( logFile +".log");
                                pw.println(sLog);
                                pw.flush();
                                pw.close();
                        }
                        else
                        {
                                pw = new PrintWriter(new FileWriter( logFile +".log", true));
                                pw.println(sLog);
                                pw.flush();
                                pw.close();
                        }

                        return true;
                }catch (IOException ie)
                {
                        System.out.println("[LogUtil] Method <writeLog>; \n"
                                        +"Write log file failed: IOException. "+ie.toString());
                        sHint="[LogUtil] Method <writeLog>; \n"
                                        +"Write log file failed: "+ie.toString();
                        return false;
                }catch (SecurityException se)
                {
                        System.out.println("Log file access failed: SecurityException."+se.toString());
                        sHint="Log file access failed: "+se.toString();
                        return false;
                }
        }

        //write log file
        public static boolean writeLog(String sFile,String sLog)
        {
                try
                {
                        File fObj=new File(sFile);
                        long lFileSize=fObj.length();
                        PrintWriter pw;
                        if ( DateUtil.getTime(.equals("1")
                        {
                                if (lFileSize>;10000000)
                                {
                                        pw = new PrintWriter(new FileWriter(sFile));
                                        pw.println(sLog);
                                        pw.flush();
                                        pw.close();
                                }
                                else
                                {
                                        pw = new PrintWriter(new FileWriter(sFile, true));
                                        pw.println(sLog);
                                        pw.flush();
                                        pw.close();
                                }
                        }
                        else
                        {
                                pw = new PrintWriter(new FileWriter(sFile, true));
                                pw.println(sLog);
                                pw.flush();
                                pw.close();
                        }

                        return true;
                }
                catch (IOException ie)
                {
                        sHint="Write log file failed: "+ie.toString();
                        return false;
                }
                catch (SecurityException se)
                {
                        sHint="Log file access failed: "+se.toString();
                        return false;
                }
        }

        public static boolean writeLog(String sPath, String sFile, String sLog, long maxFileSize)
        {
                try
                {
                        File fObj=new File(sPath + sFile + ".log";
                        File fTarget;
                        long lFileSize=fObj.length();
                        PrintWriter pw;
                        //rewrite log file from the first day of a month and file size >; maxFileSize
                        if ( DateUtil.getTime(.equals("1" || lFileSize >; maxFileSize )
                        {
                                fObj.renameTo( fTarget = new File(sPath + sFile + DateUtil.getTime(4) + ".log");
                                pw = new PrintWriter(new FileWriter(sPath+sFile +".log");
                                pw.println(sLog);
                                pw.flush();
                                pw.close();
                        }
                        else
                        {
                                pw = new PrintWriter(new FileWriter(sPath+sFile+".log", true));
                                pw.println(sLog);
                                pw.flush();
                                pw.close();
                        }

                        return true;
                }catch (IOException ie)
                {
                        System.out.println("Write log file failed: IOException. "+ie.toString());
                        sHint="Write log file failed: "+ie.toString();
                        return false;
                }catch (SecurityException se)
                {
                        System.out.println("Log file access failed: SecurityException."+se.toString());
                        sHint="Log file access failed: "+se.toString();
                        return false;
                }
        }
}

论坛徽章:
0
5 [报告]
发表于 2005-06-17 09:28 |只看该作者

一个多线程问题: 变量内容混乱

问题解决了, 是因为类的属性变量声明中使用了 static, 如下:
private static long maxFileSize = 1024000;
private static String logFile = "log";
private static String sHint ="";
private static StringBuffer strLog;
public static boolean writeLog(String sPath, String sFile, String sLog, long maxFileSize)

去掉 static ,并去掉相应method 前面的 static, 就好了!
private  long maxFileSize = 1024000;
private  String logFile = "log";
private  String sHint ="";
private  StringBuffer strLog;

public boolean writeLog(String sPath, String sFile, String sLog, long maxFileSize)

论坛徽章:
0
6 [报告]
发表于 2005-06-17 10:10 |只看该作者

一个多线程问题: 变量内容混乱

谢谢xxanadu的分享。希望大家都能把自己解决问题的结果和所有人分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP