在一个线程中按另一个状态触发功能

时间:2016-03-15 15:12:35

标签: java multithreading

我有一个服务器/客户端应用程序,其中还包含一个计时器。服务器和客户端之间允许通信,直到达到截止时间(使用Calendar对象)。在一个单独的线程中监视到达此截止日期,该线程从服务器调用:

//create and run a timer on bid items
public static void startClock()
{
    //thread to track item deadlines
    DeadlineClock deadlineClock =
            new DeadlineClock(deadline);
    //begin running the clock
    deadlineClock.start();
}

然后检测截止日期:

    //inside DeadlineClock's run() method

    //Retrieve current date and time...
    Calendar now = Calendar.getInstance();

    //deadline not yet reached
    while(now.before(deadline))
    {
        try
        {
            //wait a second and try again
            sleep(1000);
        }
        catch (InterruptedException intEx)
        {
            //Do nothing.
        }

        //Update current date and time...
        now = Calendar.getInstance();
        //run loop again
    }

我想要做的是在DeadlineClock中达到截止日期时检测(在服务器中),但我完全无法找到可行的方法来执行此操作,没有完全复制服务器中的整个计时机制。

据我所知,它基本上会在DeadlineClock方面采取某种输出或返回值,但我不知道如何在服务器端读取或检测到它,以及如果该计划涉及多个截止日期,这也很难扩展。

我唯一的另一个想法是将一个布尔变量传递给DeadlineClock构造函数,然后尝试等待检测这是否发生了变化,就像这样(假设变量的值一旦改变了)截止日期已达到):

//create and run a timer on bid items
public static void startClock()
{
    //initialise as false before items run
    boolean deadlineReached = false;

    //thread to track item deadlines
    DeadlineClock deadlineClock =
            new DeadlineClock(deadline, deadlineReached);
    //begin running the clock
    deadlineClock.start();

    //monitor other thread for value change
    while (deadlineReached != true)
    {
        //do nothing until changed
        wait();
    }
    ///////////////////////////
    ///CHANGE DECTECTED HERE///
    ///////////////////////////
}

这非常粗糙,但希望在正确的位置。任何人都可以建议我如何能够实现我之后的功能吗?

谢谢, 标记

1 个答案:

答案 0 :(得分:0)

我认为这里的问题是建筑问题,而不是其他问题。 如果您更喜欢使用Java的排队机制,那么这里的解决方案非常简单。

在客户端和服务器之间建立消息传递结构。这可以使用BlockingQueue轻松实现。

在主应用程序中初始化BlockingQueue:

BlockingQueue<String> queue = new ArrayBlockingQueue<String>();

为客户端和服务器应用程序提供队列。

在服务器应用程序的while循环中执行以下操作:

String clientMessage = """;


while(true){
clientMessage = queue.take();
}

请注意,在一个字符串元素可用之前,队列就会占用块。

在客户端应用程序中,现在只需在到达截止日期时在队列中插入一个字符串,服务器将自动得到通知。