当前位置:编程学习 > JAVA >>

最近积累的一些java细节

最近几天一直在钻研多线程问题,因为这一块一直是弱项,之前一直近不下心来细细学习,这些天网上看了一些资料,感觉受益匪浅,在此记录一下。

昨天看到关于静态类的并发问题,开始看着挺蛋疼的,擦,静态类里面怎么可能会有并发问题,设计有问题吧,用静态类处理全局变量,找抽么@。@。于是蛋疼实验了一下,哈哈,蛮好玩的!如有错误之处,欢迎指正,谢谢!

下面是代码:

首先是一个工具类,用于时间相关计算


[java]
public final class TimeUtil { 
    /* 这里故意声明了一个全局的calendar实例,让static方法改变这个实例(到底是实例还是句柄,待我灯下测试即知)的日期,凸显并发问题! */ 
    private static Calendar calendar = Calendar.getInstance(); 
 
    /**
     * 根据用户输入时间获取这一年的第几天
     * @param date
     * @return dayOfYear
     */ 
    public static int getDay(Date date) { 
        calendar.setTime(date); 
        return calendar.get(Calendar.DAY_OF_YEAR); 
    } 
 
    /**
     * 根据用户输入时间获取月份
     * @param date
     * @return month 值为月份-1
     */ 
    public static int getMonth(Date date) { 
        calendar.setTime(date); 
        return calendar.get(Calendar.MONTH); 
    } 
 
    /**
     * 根据给定字符串获得对应日期
     * @param str 格式 yyyy-MM-dd hh:mm:ss
     * @return
     */ 
    public static Date getTimeByStr(String str) { 
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 
        Date time = null; 
        try { 
            time = df.parse(str); 
        } catch (ParseException e) { 
            e.printStackTrace(); 
        } 
        return time; 
    } 

public final class TimeUtil {
    /* 这里故意声明了一个全局的calendar实例,让static方法改变这个实例(到底是实例还是句柄,待我灯下测试即知)的日期,凸显并发问题! */
    private static Calendar calendar = Calendar.getInstance();

    /**
     * 根据用户输入时间获取这一年的第几天
     * @param date
     * @return dayOfYear
     */
    public static int getDay(Date date) {
        calendar.setTime(date);
        return calendar.get(Calendar.DAY_OF_YEAR);
    }

    /**
     * 根据用户输入时间获取月份
     * @param date
     * @return month 值为月份-1
     */
    public static int getMonth(Date date) {
        calendar.setTime(date);
        return calendar.get(Calendar.MONTH);
    }

    /**
     * 根据给定字符串获得对应日期
     * @param str 格式 yyyy-MM-dd hh:mm:ss
     * @return
     */
    public static Date getTimeByStr(String str) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date time = null;
        try {
            time = df.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return time;
    }
接着是一个测试线程类


[java]
public class TestStaticThread implements Runnable { 
 
    String timeStr; 
 
    public TestStaticThread(String timeStr) { 
            this.timeStr = timeStr; 
    } 
 
    @Override 
    public void run() { 
        try { 
            //不加sleep时间效果不明显啊!  
            Thread.sleep(100L); 
 
            Date time = TimeUtil.getTimeByStr(timeStr); 
            int day = TimeUtil.getDay(time); 
            int month = TimeUtil.getMonth(time); 
 
            System.out.println("线程[" + Thread.currentThread().getName() + "]指定日期为[" + timeStr + "], " + 
                    "经过幸苦的计算后, 得到的天数为[" + day + "], 得到的月份为[" + (month + 1) + "月]"); 
        } catch (InterruptedException e) { 
            e.printStackTrace(); 
        } 
    } 

public class TestStaticThread implements Runnable {

    String timeStr;

    public TestStaticThread(String timeStr) {
            this.timeStr = timeStr;
    }

    @Override
    public void run() {
        try {
            //不加sleep时间效果不明显啊!
            Thread.sleep(100L);

            Date time = TimeUtil.getTimeByStr(timeStr);
            int day = TimeUtil.getDay(time);
            int month = TimeUtil.getMonth(time);

            System.out.println("线程[" + Thread.currentThread().getName() + &qu

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,