读书笔记:
同步器有:信号量(Semaphore)
倒计时门拴(CountDownLatch)
障栅(CyclicBarrier)
交换器(Exchanger)
同步队列(SynchronousQueue)
信号量的一个例子:是一个数组的排序,使用的是Comparator,把排序的步骤在Jpanl中显示出来。
package v1ch14.AlgorithmAnimation;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.util.*;
import java.util.concurrent.*;
import javax.swing.*;
/**
* This program animates a sort algorithm.
* @version 1.01 2007-05-18
* @author Cay Horstmann
*/
public class AlgorithmAnimation
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new AnimationFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
/**
* This frame shows the array as it is sorted, together with buttons to single-step the animation or
* to run it without interruption.
*/
class AnimationFrame extends JFrame
{
public AnimationFrame()
{
ArrayComponent comp = new ArrayComponent();
add(comp, BorderLayout.CENTER);
final Sorter sorter = new Sorter(comp);
JButton runButton = new JButton("Run");
runButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
sorter.setRun();
}
});
JButton stepButton = new JButton("Step");
stepButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
sorter.setStep();
}
});
JPanel buttons = new JPanel();
buttons.add(runButton);
buttons.add(stepButton);
add(buttons, BorderLayout.NORTH);
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
Thread t = new Thread(sorter);
t.start();
}
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 300;
}
/**
* This runnable executes a sort algorithm. When two elements are compared, the algorithm pauses and
* updates a component.
*/
class Sorter implements Runnable
{
/**
* Constructs a Sorter.
* @param values the array to be sorted
* @param comp the component on which to display the sorting progress
*/
public Sorter(ArrayComponent comp)
{
values = new Double[VALUES_LENGTH];
for (int i = 0; i < values.length; i++)
values[i] = new Double(Math.random());
this.component = comp;
this.gate = new Semaphore(1);
this.run = false;
}
/**
* Sets the sorter to "run" mode. Called on the event dispatch thread.
*/
public void setRun()
{
run = true;
gate.release();//信号量释放
}
/**
* Sets the sorter to "step" mode. Called on the event dispatch thread.
*/
public void setStep()
{
run = false;
gate.release();//信号量释放
}
public void run()
{
Comparator<Double> comp = new Comparator<Double>()
{
public int compare(Double i1, Double i2)
{
component.setValues(values, i1, i2);
try
{
if (run) Thread.sleep(DELAY);
else gate.acquire(); //信号量的申请。
}
catch (InterruptedException exception)
{
Thread.currentThread().interrupt();
}
return i1.compareTo(i2);
}
};
Arrays.sort(values, comp);
component.setValues(values, null, null);
}
private Double[] values;
private ArrayComponent component;
private Semaphore gate;
private static final int DELAY = 100;
private volatile boolean run;
private static final int VALUES_LENGTH = 30;
}
/**
* This component draws an array and marks two elements in the array.
*/
class ArrayComponent extends JComponent
{
/**
* Sets the values to be painted. Called on the sorter thread.
* @param values the array of values to display
* @param marked1 the first marked element
* @param marked2 the second marked element
*/
public synchronized void setValues(Double[] values, Double marked1, Double marked2)
{
this.values = values.clone();
this.marked1 = marked1;
this.marked2 = marked2;
System.out.println("marked1:"+marked1);
System.out.println("marked2:"+marked2);
repaint();
}
public synchronized void paintComponent(Graphics g) // Called on the event dispatch thread
{
if (values == null) return;
Graphics2D g2 = (Graphics2D) g;
int width = getWidth() / values.length;
for (int i = 0; i < values.length; i++)
{
double height = values[i] * getHeight();
Rectangle2D bar = new Rectangle2D.Double(width * i, 0, width, height);
if (values[i] == marked1 || values[i] == marked2){
// System.out.println("marked1:"+marked1);
// System.out.println("marked2:"+marked2);
g2.fill(bar);}
else g2.draw(bar);
}
}
private Double marked1;
private Double marked2;
private Double[] values;
}
分享到:
相关推荐
麒麟虚拟机同步器1.5p版是一款专为虚拟机设计的同步工具,它主要针对的是麒麟操作系统在虚拟环境下的应用。麒麟操作系统是中国自主研发的一款开源操作系统,基于Linux内核,旨在提供安全、稳定、高效的计算环境。这...
麒麟虚拟机同步器2.2p版是一款专为麒麟操作系统设计的高效虚拟机同步工具,旨在提高多虚拟机环境下的协作效率和数据一致性。这款软件能够实现不同虚拟机实例之间的实时数据同步,确保用户在各个虚拟环境中都能获取到...
"键鼠多开同步器"是一种专为游戏多开或者多任务操作设计的软件工具,它的主要功能是实现多个窗口间键盘和鼠标操作的同步。这意味着用户在一个游戏或应用程序中的输入,可以同时被其他打开的相同程序窗口所接收,极大...
同步器建模与分析是汽车传动系统设计中的一个重要环节,尤其是在手动变速箱设计中,同步器的作用是确保换挡平顺,避免齿轮碰撞。Romax作为一款专业的传动系统设计和分析软件,提供了强大的同步器建模与分析功能。在...
标题中的“多窗口同步器”是一款专为提高办公效率设计的软件工具,它允许用户将桌面分割成多个独立的工作窗口,以便同时管理和操作多个应用程序或文档。这种工具尤其适合需要频繁切换窗口或进行多任务处理的用户,如...
为了解决这个问题,有几种同步技术被广泛使用,包括电平同步器、边沿同步器和脉冲同步器。以下将详细讨论这些同步器的工作原理、设计方法以及它们在Verilog中的实现。 首先,电平同步器(Level Synchronizer)是最...
《HellX 局域网键鼠同步器:开启多游戏操控新纪元》 在现代电子竞技和游戏娱乐中,玩家往往需要同时操作多个游戏,无论是为了比较不同游戏的体验,还是进行多开游戏的策略,这样的需求日益增长。这时,一款名为...
【麒麟VM虚拟机同步器V2.2】是一款专为VMware Workstation设计的实用工具,旨在解决在多虚拟机环境中进行键盘和鼠标同步操作的问题。VMware Workstation是一款强大的桌面虚拟化软件,允许用户在同一台物理主机上运行...
《多窗口操作同步器v1.3:实现高效多任务同步处理》 在现代的多任务处理环境中,高效地管理并同步多个软件窗口的操作成为了一项挑战。"多窗口操作同步器v1.3"正是为此目的而设计的一款实用工具,它能够帮助用户在...
超玩鼠键同步器是使用按键精灵制作的一款鼠键同步器,支持多窗口同步按键、鼠标动作,支持双开,支持鼠标拖拽,不支持鼠标双击、滚轮功能,一般是在游戏多开时使用,两个游戏窗口中鼠标和键盘的操作完全两步 ...
窗口同步器。易语言编写的。同步本地窗口
学习游戏脚本制作:按键精灵键鼠同步器源码分享 本文主要讲解了学习游戏脚本制作中的按键精灵键鼠同步器的实现原理和具体实现步骤。按键精灵键鼠同步器是游戏同步的重要组件,它可以实现在两个窗口之间的键鼠同步。...
窗口同步器是一种软件工具,它的主要功能是在多个窗口或实例之间实现操作的同步。这个工具尤其适用于需要同时处理多个相同程序或应用的工作场景,比如在编程、数据分析、文本编辑或者多任务管理时。通过窗口同步器,...
在电子工程领域,异步输入的同步器和开关防颤电路是两个重要的概念,它们在数字逻辑系统,尤其是微控制器和嵌入式系统的设计中扮演着关键角色。本篇文章将详细探讨这两个概念,并以4位二进制计数器的设计为例,阐述...
帧同步器设计是数字通信系统中的重要组成部分,它在接收端恢复发送端的帧边界,确保数据正确解码。在清华大学电子工程系的数字逻辑与处理器基础实验中,学生将学习如何设计这样的系统,特别是在FPGA(Field-...
《网络时间同步器详解》 在数字化社会中,时间的准确性对于各种系统和服务的正常运行至关重要。网络时间同步器就是确保设备时间精确无误的重要工具。本文将详细探讨网络时间同步器的概念、工作原理以及其在实际应用...
窗口同步器密码1
网络时间同步器是一种重要的工具,尤其在网络环境中的各种操作中,准确的时间同步是至关重要的。在秒杀活动中,网络时间的精确性对于确保公平公正至关重要,因为抢购往往依赖于毫秒级的时间精度来决定谁是第一个提交...
风云时间同步器V1.1是一款专为用户设计的实用工具,旨在帮助用户轻松地将他们的计算机时钟与网络上的标准时间服务器进行同步,确保电脑时间的准确无误。时间同步对于日常计算机操作、网络通信以及某些特定应用程序的...
好人多窗口同步器!