import java.util.Timer;
import java.util.TimerTask;public class CSTimeTask
{
    private static CSTimeTask instance = null;    private static TimerTask csTimerTask = null;    Timer myTimer = null;    public CSTimeTask()
    {    }    public static synchronized CSTimeTask getInstance()
    {
        if (instance == null)
        {
            instance = new CSTimeTask();
        }
        return instance;
    }    public synchronized void sendHeartBeatNotifyByTime(short peroid)
    {        if (csTimerTask != null)
        {            csTimerTask.cancel();
            myTimer.schedule(csTimerTask, 0, peroid);
                    }
        else
        {
            csTimerTask = new SetCSTimerTask();
            myTimer = new Timer();
            myTimer.schedule(csTimerTask, 0, peroid);
        }    }}class SetCSTimerTask extends TimerTask
{
    int i = 0;    public void run()
    {
        System.out.println("Timer Task. " + i);
        i++;    }
}public class TestA
{    /**
     * @param args
     */
    public static void main(String[] args)
    {
        CSTimeTask csTimeTaskA = CSTimeTask.getInstance();
        csTimeTaskA.sendHeartBeatNotifyByTime((short)500);
        
    }}public class TestB
{    /**
     * @param args
     */
    public static void main(String[] args)
    {
        CSTimeTask csTimeTaskB = CSTimeTask.getInstance();        
        
        csTimeTaskB.sendHeartBeatNotifyByTime((short)1000);    }}TestA 先去调度,然后TestB去调度,为什么这个时候B去调度A停止不了呢?

解决方案 »

  1.   

    Timer的schedule, 如果已经安排或取消了任务,已经取消了计时器,或者计时器线程已终止。再调用时会抛IllegalStateException 的,
    你这里没有抛。说明已经不是同一个timer了。
      

  2.   

    TestA 和 TestB 运行在不同的JVM中,在不同的环境下了,两个各自load了各自的CSTimeTaskpublic class TestA
    {    /**
         * @param args
         */
        public static void main(String[] args)
        {
            CSTimeTask csTimeTaskA = CSTimeTask.getInstance();
            csTimeTaskA.sendHeartBeatNotifyByTime((short)500);
            CSTimeTask csTimeTaskB = CSTimeTask.getInstance();  
            csTimeTaskB.sendHeartBeatNotifyByTime((short)1000);        
        }}
      

  3.   

    本设计采用孩子兄弟双亲链表的存储结构,引入了一个Tree类,将树的构造、销毁、目录大小的重新计算(reSize)、建立树形链表结构(parse)、树形机构输出(outPut)等一系列操作都封装起来,另设置了三个指针,即父指针(Tree* parent)、下一个兄弟指针(Tree* NextSibling)和第一个孩子指针(Tree* FirstChild)。运用二叉树的后序遍历算法将每一个节点的size值都加到根节点的size中去,如果当前的节点没有孩子节点,则它的size值即为输入时的值;运用二叉树的先序遍历算法将输入的字符串有缩进的输出,在此基础之上完成系统设计,实现了文件目录结构的显示。此文中还具体给出Linux下目录和文件信息,并在Visual Studio C++ 6.0环境里面实现将其排列成一棵有一定缩进的树。 
    按照上面编个程序. 
    我尝试用了兄弟双亲链表;二叉树先序遍历;后序遍历,还是做不出来. 
    请高手编个程序谢谢,我急用.下午就要用了。我已经2个晚上没合眼了..
      

  4.   


     if (instance == null)
            {
                System.out.println("new CSTimeTask();");
                instance = new CSTimeTask();
            }
            return instance;
    发现你的单例失效了。分别运行TestA,和TestB都创建了CSTimeTask。
      

  5.   


     正解  你不能写两个main函数啊,  两个主线程和两个线程不是一个概念
      

  6.   

    Java嘛。据我所知,进程间通信,被局限在两个虚拟机之间的通信上了。
    所以,一般应该是Socket,RMI之类的。
      

  7.   

    个人见解:首先 你想把CSTimeTask定义成Singleton单例模式,但是你将构造器的可见
    设置为共有(应该改成私有)。没有达到你所要的效果。直接new就可以了。
       其次你说是线程我没有看到线程的影子。恩,只看到了任务调度。
       TestA 和 TestB 运行在不同的JVM中,在不同的环境下了,两个各自load了各自的CSTimeTask 说法我赞成。但是在一起运行
    也会有问题。你的设计模式有问题。
      

  8.   

    把TestA与TestB中main中的内容复制到一个类中再执行
    分别运行TestA与TestB不能得到你要的效果5楼给出的答案正确。