Java EDT是否可能有太多的工作?
此示例不断绘制各种颜色的正方形。正方形的数量取决于JFrame的大小 在执行示例时,使用鼠标放大或缩小尺寸框,它将增加或减少可见闪烁方块的数量 帧的时间栏显示时间。本例在draw()例程中还有一个System.out.println 我们的目的不是讨论这个例子写得有多差,而是将其用作提出问题的工具Java EDT是否可能有太多的工作?,java,performance,event-dispatch-thread,Java,Performance,Event Dispatch Thread,此示例不断绘制各种颜色的正方形。正方形的数量取决于JFrame的大小 在执行示例时,使用鼠标放大或缩小尺寸框,它将增加或减少可见闪烁方块的数量 帧的时间栏显示时间。本例在draw()例程中还有一个System.out.println 我们的目的不是讨论这个例子写得有多差,而是将其用作提出问题的工具 import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.text.Simple
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class LotsOfSquares extends JPanel
{
Random rand = new Random();
static JFrame frame = new JFrame("Lots Of Squares ");
int numOfSquares = 0;
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
int sizeOfSquare = 5;
numOfSquares = 0;
for (int x=0; x<frame.getSize().width; x = x + sizeOfSquare )
{
numOfSquares ++;
for (int y=0; y<frame.getSize().height; y = y + sizeOfSquare )
{
g2d.setColor(new Color(rand.nextFloat(), rand.nextFloat(), rand.nextFloat()));
g2d.fillRect(x, y, sizeOfSquare, sizeOfSquare);
numOfSquares ++;
System.out.println(" Displaying " + numOfSquares + " squares within Inner Loop");
}
}
//System.out.println(" Displaying " + numOfSquares + " squares total");
}
public static void main(String[] args)
{
LotsOfSquares rects = new LotsOfSquares ();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(rects);
frame.setSize(360, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
TimerTask repeatedTask = new TimerTask()
{
public void run()
{
//System.out.println("Task performed on " + new Date());
frame.repaint();
}
};
Timer timer = new Timer("Refresh Timer");
long delay = 1000L;
long period = 150L;
timer.scheduleAtFixedRate(repeatedTask, delay, period);
TimerTask clockTask = new TimerTask()
{
public void run()
{
SimpleDateFormat timeFormat = new SimpleDateFormat("hh:mm:ss");
Calendar currentCalendar = Calendar.getInstance();
Date currentTime = currentCalendar.getTime();
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
frame.setTitle(timeFormat.format(currentTime) );
}
});
}
};
Timer clockTimer= new Timer("Clock Timer");
long clockDelay = 1000L;
long clockPeriod = 1000L;
clockTimer.scheduleAtFixedRate(clockTask, clockDelay, clockPeriod);
}
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.text.simpleDataFormat;
导入java.util.Calendar;
导入java.util.Date;
导入java.util.Random;
导入java.util.Timer;
导入java.util.TimerTask;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
公共类lotsofjpanel
{
Random rand=新的Random();
静态JFrame=新JFrame(“大量正方形”);
int numOfSquares=0;
公共组件(图形g)
{
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
int sizeOfSquare=5;
numOfSquares=0;
对于(int x=0;x您可以在其他线程上绘制,然后将生成的图像传递到组件中进行绘制。通过这种方式,您可以将工作转移到其他线程,从而使EDT不再执行繁重的任务。您可以使用多个线程来准备所需的图像,这取决于您。这是我通常处理图形的方式这需要很大的功率才能获得更好的帧速率
在您的示例中,我将创建一些带有多个线程的Exacutor,并创建一些将来为您创建BuffereImage,然后您将这些任务的数量提供给执行器,当您准备好BuffereImage时,将其传递给要绘制的组件。这样,您可以获得更高的性能。中有多少个线程执行器或何时向执行器提供新任务留给OP考虑。您可以在其他线程上绘制,然后将生成的图像传递到组件中进行绘制。这样,您可以将工作卸载到其他线程,从而使EDT不再执行繁重的任务。您可以使用多个线程进行准备这是我通常处理需要大量能量才能获得更好帧速率的图形的方式
在您的示例中,我将创建一些带有多个线程的Exacutor,并创建一些将来为您创建BuffereImage,然后您将这些任务的数量提供给执行器,当您准备好BuffereImage时,将其传递给要绘制的组件。这样,您可以获得更高的性能。中有多少个线程执行器,或何时向执行器提供新任务,留待OP考虑。感谢您的反馈。我想关键是只有在所有“工作”线程完成时才绘制BuffereImage。感谢您的反馈。我想关键是只有在所有“工作”线程完成时才绘制BuffereImage。