春天里,百花香...
#
摘要: 一个解析文本中的信息并向对象赋值过程的思考,比较浅显.
阅读全文
摘要: private的成员变量能被子类继承吗?回答是父类的所有成员变量包括私有成员变量都会被子类继承,private只是把可见性限制在改类内部的方法中而已,子类仍然可以通过父类的成员函数来访问不可见的从父类继承下来的私有成员.
这个机制对于复杂的类体系中保护父类不被滥用很有好处.
阅读全文
摘要: 本文分析了java.util.ConcurrentModificationException出现的原因及处置办法.
阅读全文
摘要: 本文是"使XML作为持久存储介质的解决方案 "的续文.
上文中对成员的CRUD都采用同步进行资源保护,这种方案实际上是保护过度,带来的消极影响是降低了程序的效率,在下面的例子中,我们应该使用读写锁对资源进行保护.关于读写锁的分析请见"读写锁的OO分析(http://www.blogjava.net/sitinspring/archive/2007/10/21/154652.html)".
...
阅读全文
线程回调方式我们已经在"
使用回调和线程处理一个耗时响应过程"文中进行了讲述,但是有些情况下用户希望在指定时间内返回一个结果,免得无休止的等待下去.这时我们需要使用"限时线程回调方式",它在原有线程回调的基础上加上了一个Timer以计算消耗的时间,如果时间期限到了任务还没有执行完的话即中断线程,示例代码如下:
package com.sitinspring;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Timer;


/** *//**
* 定时回调线程类
*
* @author sitinspring(junglesong@gmail.com)
*
* @date 2007-11-6
*/

public class TimedCallBackThread implements Runnable
{
// 一秒的毫秒数常量
private final static int ONE_SECOND = 1000;

// 限制时间,以秒为单位
private final int waitTime;

// 已经流逝的时间
private int passedTime;

private Timer timer;

private Thread thread;

private MvcTcModel model;

private MvcTcView view;


public TimedCallBackThread(MvcTcModel model, MvcTcView view, int waitTime)
{
this.model = model;
this.view = view;
this.waitTime = waitTime;
this.passedTime = 0;

// 创建并启动定时器

timer = new Timer(ONE_SECOND, new ActionListener()
{

public void actionPerformed(ActionEvent evt)
{
timeListener();
}
});
timer.start();

// 创建并启动线程来完成任务
thread = new Thread(this);
thread.start();
}


private void timeListener()
{
passedTime++;

// 动态显示状态
int modSeed = passedTime % 3;

if (modSeed == 0)
{
view.getLabel2().setText("响应中");

} else if (modSeed == 1)
{
view.getLabel2().setText("响应中..");

} else if (modSeed == 2)
{
view.getLabel2().setText("响应中
.");
}

// 如果流逝时间大于规定时间则中断线程

if (passedTime > waitTime)
{
passedTime = waitTime;
thread.interrupt();
}
}


public void run()
{

while (passedTime < waitTime)
{

try
{
Thread.sleep(10000);// 模拟一个耗时相应过程
timer.stop();// 任务完成,停止Timer

view.getLabel2().setText(model.getText2());

} catch (InterruptedException ex)
{
timer.stop();// 线程中断,停止Timer
view.getLabel2().setText("在指定时间内未响应");

} catch (Exception ex)
{
ex.printStackTrace();
}

return;
}
}
}
执行效果如下:

本文代码下载(点击第二个按钮):
http://www.blogjava.net/Files/sitinspring/TimedThreadCallBack20071106194506.rar
摘要: 一般来说,可以把系统粗略的分为三个层次,视图层,简称为View,它负责数据的输出和输入;业务层,简称为Model,它代表程序的实际业务;控制层,简称为Controller,处理界面的相应并调用业务层进行处理,有时把View和Controller两层合称为UI层。
在程序发展的历史上,MVC模式进过了多次演化,MVC1和MVC2是两种比较典型的模式,它们的区别主要在于View和Model的联系方式...
阅读全文
摘要: 我们有时会遇到对同一个内存区域如数组或者链表进行多线程读写的情况,一般来说有以下几种处理方式:
1.不加任何限制,多见于读取写入都很快的情况,但有时也会出现问题.
2.对读写函数都加以同步锁,比如使用singleton模式,这下问题是没了,但效率也下去了,比如说两个读取线程不是非要排队进入不可.
3.读写锁,安全和效率都得到了解决,特别合适读线程多于写线程的情况.也就是下面将要展现的模式.
读写锁的本意是分别对读写状态进行互斥区分,有互斥时才加锁,否则放行.互斥的情况有:
1.读写互斥.
2.写写互斥.
不互斥的情况是:读读,这种情况不该加以限制.
我们只要让锁对象知道当前读写状态就可以了,再根据情况进行锁定和解锁,然后再分情况进行锁定.请看代码
阅读全文
摘要: 这篇文章是"调度员,工人及任务的OO分析过程"的续篇.
上次的情况是由调度员主动分配任务,但有些情况下需要工人自动取得任务而不是由调度员分配,这时需要对线程进行通知,使用的主要方法就是对象的wait(),notify(),notifyAll()三个函数,它们都必须从同步方法(synchronized method)中调用.
阅读全文
摘要: 日常编码中,我们常需要为各种业务进行建模,为工厂中的任务调度建模就很有意思的,它的主要流程是基本是这样:
1.调度员将工件图纸交付给工人,这是任务的下达.
2.工人工作,完成工件,这是任务的进行过程.
3.工件完成后,工人将图纸和工件返还给调度员,或者到了确定的时间后由调度员去取.这是任务的完成.
4.重复上述三个步骤.
在这个流程中,还存在一些特征:
1.工人可以有多项任务,但他在一个时间只能做一个活,具体做那个由任务的优先级确定.
2.任务完成后要让调度员知道,现实中是工人来找调度员或者调度员找工人来实现的.
从上述情况分析,我们需要任务,工人,调度员三个类来完成建模,另外为了方便任务的存储和管理,还需要一个任务串类来辅助.
阅读全文
sitinspring(http://www.blogjava.net)原创,转载请注明出处.