syncthread.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 90 行

JAVA
90
字号
/* class SyncThread
 *
 * Copyright (C) 2001  R M Pitman
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package charva.awt;

import charva.awt.event.AWTEvent;
import charva.awt.event.GarbageCollectionEvent;
import charva.awt.event.SyncEvent;

/**
 * The purpose of this class it to speed up redrawing of the screen
 * after the closing (or opening) of a window and the subsequent opening 
 * of a new window, by delaying the calling of Toolkit.sync() until 
 * the new window has had a chance to be drawn.<p>
 *
 * Note that it is not _guaranteed_ that the new window will be drawn in 
 * time, but it probably will be.<p>
 * 
 * This thread loops forever, reading SyncEvents off the SyncQueue
 * (a SyncEvent is generated whenever a window closes and the underlying
 * windows have been redrawn).
 * After reading the event off the queue, this thread sleeps for 50 msec
 * and then puts the event onto the EventQueue, from which it will be 
 * picked up by the active window. If there are more events on the SyncQueue
 * when the thread awakes, the SyncQueue is drained.<p>
 *
 * This thread also processes GarbageCollectionEvents; when it receives
 * a GarbageCollectionEvent, it calls System.gc() (after waiting 50 msec
 * to give the AWT event-handler time to complete).
 */
class SyncThread
    extends Thread
{
    SyncThread(SyncQueue syncQueue_, EventQueue eventQueue_) {
	_syncQueue = syncQueue_;
	_eventQueue = eventQueue_;
    }

    public void run() {
	for (;;) {
	    AWTEvent evt = _syncQueue.getNextEvent();
        // Sync thread exit point
        if(evt == null) break;
	    try {
		sleep(50); 
	    }
	    catch (InterruptedException e) {
		System.err.println("SyncThread: sleep interrupted!");
	    }

	    if (evt instanceof SyncEvent) {
		_eventQueue.postEvent(evt);

		/* If there any more SyncEvents on the queue, drain the queue;
		 * there is no point in putting more than one SyncEvent on the
		 * EventQueue.
		 */
		while (_syncQueue.isEmpty() == false) {
		    if (_syncQueue.getNextEvent() instanceof GarbageCollectionEvent) {
			System.gc();
			break;
		    }
		}
	    } /* //LS
	    else
		System.gc();	// it was a GarbageCollectionEvent
        */
	}
    }

    private SyncQueue _syncQueue;
    private EventQueue _eventQueue;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?