- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我花了好几个小时试图找出实验室练习的要求之一。
计划摘要
类PrimeSeekerTask
生成一个范围之间的素数。PrimeSeekerDisplay
是一个显示在 PrimeSeekerTask
中完成的工作的类。PrimeSeekerTask 应该在后台进行“繁重”计算。我需要为 PrimeSeekerTask
扩展 SwingWorker
。
在程序运行期间,应该有多个 PrimeSeekerTask
实例来执行一小部分计算。我需要使用 ExecutionService
。
此外,程序应在单击开始按钮时启动,并在单击取消按钮时中断。
当我将任务作为单个后台 SwingWorker
运行时,它工作正常(如本屏幕截图所示)
但程序规范是我应该运行许多 SwingWorker
对象。
我的问题。
当我尝试使用 ExecutionService
时,程序挂起并消耗了几乎 100% 的 CPU,笔记本电脑开始崩溃。对于小数字,我得到错误的百分比值和找到的质数。我猜想有一些同步错误,但我认为 Atomic
修复了其中的一些错误?
我的取消按钮不会中断任务。
任何形式的帮助将不胜感激。
下面是我的真实尝试(我删除了导入以使代码更短)
public class PrimeSeekerDisplay extends JFrame
implements ActionListener, PropertyChangeListener {
private JLabel topLabel;
private JTextArea textArea;
private JProgressBar progressBar;
private JButton startButton;
private JButton cancelButton;
private JLabel primesFoundLabel;
private final long max;
private final long chunkSize;
PrimeSeekerTask task = null;
private final int THREAD_NUMBER = 9;
ExecutorService executorService = Executors
.newFixedThreadPool(THREAD_NUMBER);
/**
*
*/
private static final long serialVersionUID = 6602966318374691217L;
/**
*
*/
public PrimeSeekerDisplay(final long max, final long chunkSize) {
super("Prime Seeker");
this.max = max;
this.chunkSize = chunkSize;
initGui();
}
/*
* initGui() creates all the components and lays them on the display
*/
private final void initGui() {
// the top label
topLabel = new JLabel("Primes in [1.." + String.valueOf(max) + "]");
final JPanel topPanel = new JPanel();
topPanel.add(topLabel);
topPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
// the text area
final JScrollPane textPane = createTextArea();
// the progress bar
progressBar = new JProgressBar(0, 100);
progressBar.setStringPainted(true);
progressBar.setBorder(BorderFactory.createLineBorder(Color.BLACK));
// the buttons and items in the status pane
startButton = createButton("Start");
// enable this at the beginning of program.
// This will be disabled when clicked
startButton.setEnabled(true);
cancelButton = createButton("Cancel");
// Disable cancel before program starts.
// Once program starts, this will be enabled
cancelButton.setEnabled(false);
// update this with number of primes found.
// only print something here when atleast a prime is found
primesFoundLabel = new JLabel();
primesFoundLabel.setEnabled(false);
final JPanel statusPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
statusPanel.setBorder(new EmptyBorder(10, 0, 0, 0));
statusPanel.add(startButton);
statusPanel.add(cancelButton);
statusPanel.add(primesFoundLabel);
// Jpanel to hold all components
final JPanel displayPanel = new JPanel();
displayPanel.setLayout(new BoxLayout(displayPanel, BoxLayout.Y_AXIS));
// add components to the display panel
displayPanel.add(topPanel);
displayPanel.add(textPane);
displayPanel.add(progressBar);
displayPanel.add(statusPanel);
displayPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
// add the displayPanel to the frame
add(displayPanel);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
}
/**
* Create the text area embedded inside a ScrollPane
*
* @return a JScrollPane object
*/
private JScrollPane createTextArea() {
textArea = new JTextArea(8, 40);
textArea.setMargin(new Insets(5, 5, 5, 5));
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setEditable(false);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
final JScrollPane scrollPane = new JScrollPane(textArea);
return scrollPane;
}
/**
* A method for creating a JButton
*
* @param text The text to display on the button This value in lower
* case is also the actionCommand
* @return A JButton with text, actionCommand, and action listener set
*/
private JButton createButton(final String text) {
final JButton button = new JButton(text);
button.setActionCommand(text.toLowerCase());
button.addActionListener(this);
return button;
}
/*
* (non-Javadoc)
*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.
* ActionEvent)
*/
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equalsIgnoreCase("start")) {
startButton.setEnabled(false);
cancelButton.setEnabled(true);
textArea.setText(null);
primesFoundLabel.setText("Nothing found yet");
// ####### Attempt to run many PrimeSeekerTasks fails ######
// ****** i need help here and how to cancel the process///
/*
int chunk = (int) (max / chunkSize);
System.out.println("chunk => " + chunk);
int remainder = (int) (max % chunkSize);
for (int index = 0; index < chunk; index++) {
final long lower = index * chunkSize;
final long upper = (index == chunk - 1
? (lower + remainder + chunkSize)
: (lower + chunkSize));
System.out.println("Index: " + index + " Lower: " + lower
+ " upper: " + upper);
PrimeSeekerTask primer = new PrimeSeekerTask(lower, upper);
primer.addPropertyChangeListener(this);
executorService.submit(primer);
}
*/
// =======
//Running this works very well but it is not according to
// program specs
// ===========
task = new PrimeSeekerTask(1, max);
task.addPropertyChangeListener(this);
task.execute();
}
if (e.getActionCommand().equalsIgnoreCase("cancel")) {
if (task != null) {
task.cancel(true);
}
startButton.setEnabled(true);
cancelButton.setEnabled(false);
//executorService.shutdownNow();
}
}
/**
* PrimeSeekerTask generatates prime numbers in a range and updates the
* progressBar, textArea and primesFoundLabel
*
*
* @author longb
*
*/
private class PrimeSeekerTask extends SwingWorker<String, String> {
private final long lowerRange;
private final long upperRange;
private final AtomicInteger progressMade = new AtomicInteger(0);
private final AtomicLong primesFound = new AtomicLong(0);
/**
* @param upperRange
* @param lowerRange
*/
public PrimeSeekerTask(final long lowerRange, final long upperRange) {
super();
this.lowerRange = lowerRange;
this.upperRange = upperRange;
}
/*
* (non-Javadoc)
*
* @see javax.swing.SwingWorker#doInBackground()
*/
@Override
protected String doInBackground() throws Exception {
while (!isCancelled()) {
for (long lower = lowerRange; lower < upperRange; lower++) {
if (isPrime(lower)) {
primesFound.getAndIncrement();
publish(String.valueOf(lower));
primesFoundLabel.setText(
"Primes found: " + primesFound.intValue());
}
progressMade.getAndIncrement();
int progress = (int) (100 * (progressMade.intValue() + 1)
/ upperRange);
setProgress(progress);
}
}
return "\n";
}
/*
* (non-Javadoc)
*
* @see javax.swing.SwingWorker#process(java.util.List)
*/
@Override
protected void process(List<String> chunks) {
for (String string : chunks) {
textArea.append(string + ", ");
}
}
/*
* (non-Javadoc)
*
* @see javax.swing.SwingWorker#done()
*/
@Override
protected void done() {
startButton.setEnabled(true);
cancelButton.setEnabled(false);
}
}
private boolean isPrime(final long number) {
final long limit = (long) Math.sqrt(number) + 1;
if (number < 2) {
return false;
}
for (long i = 2; i < limit; ++i) {
if ((number % i) == 0) {
return false;
}
}
return true;
}
/*
* (non-Javadoc)
*
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.
* PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equalsIgnoreCase(evt.getPropertyName())) {
int progress = (int) evt.getNewValue();
progressBar.setValue(progress);
}
}
}
//在 Run.java 中
public class Run {
/**
*
*/
public Run() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
if (args.length == 3) {
for (int i = 0; i < args.length; i++) {
System.out.println("arg#" + i + " : " + args[i]);
}
try {
long max = Integer.valueOf(args[1]);
long chunksize = Integer.valueOf(args[2]);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
PrimeSeekerDisplay display = new PrimeSeekerDisplay(max,
chunksize);
display.setVisible(true);
}
});
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.err.println("\nUsage: lab8 maxValue chunkSize\n");
}
}
}
提前致谢。
最佳答案
此答案与发布的第二个问题相关:“我的取消按钮不会中断任务”。
您有一个 while
循环,当 isCancelled()
返回 false 时,该循环应该停止:
`while (! isCancelled())`
问题是,它后面跟着一个 for
循环。仅当 for
循环完成时才会评估停止条件。
要克服它,只需添加
if (isCancelled() ) { break;}
在for
循环内。
第一个问题需要更多调查。
(注意one question per post policy)
关于java - 具有 ExecutionService 和共享对象的 SwingWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54164914/
这是代码片段。 请说出这种用小内存存储大数据的算法是什么。 public static void main(String[] args) { long longValue = 21474836
所以我使用 imap 从 gmail 和 outlook 接收电子邮件。 Gmail 像这样编码 =?UTF-8?B?UmU6IM69zq3OvyDOtc68zrHOuc67IG5ldyBlbWFpb
很久以前就学会了 C 代码;想用 Scheme 尝试一些新的和不同的东西。我正在尝试制作一个接受两个参数并返回两者中较大者的过程,例如 (define (larger x y) (if (> x
Azure 恢复服务保管库有两个备份配置选项 - LRS 与 GRS 这是一个有关 Azure 恢复服务保管库的问题。 当其驻留区域发生故障时,如何处理启用异地冗余的恢复服务保管库?如果未为恢复服务启
说,我有以下实体: @Entity public class A { @Id @GeneratedValue private Long id; @Embedded private
我有下一个问题。 我有下一个标准: criteria.add(Restrictions.in("entity.otherEntity", getOtherEntitiesList())); 如果我的
如果这是任何类型的重复,我会提前申请,但我找不到任何可以解决我的具体问题的内容。 这是我的程序: import java.util.Random; public class CarnivalGame{
我目前正在使用golang创建一个聚合管道,在其中使用“$ or”运算符查询文档。 结果是一堆需要分组的未分组文档,这样我就可以进入下一阶段,找到两个数据集之间的交集。 然后将其用于在单独的集合中进行
是否可以在正则表达式中创建 OR 条件。 我正在尝试查找包含此类模式的文件名列表的匹配项 第一个案例 xxxxx-hello.file 或者案例二 xxxx-hello-unasigned.file
该程序只是在用户输入行数时创建菱形的形状,因此它有 6 个 for 循环; 3 个循环创建第一个三角形,3 个循环创建另一个三角形,通过这 2 个三角形和 6 个循环,我们得到了一个菱形,这是整个程序
我有一个像这样的查询字符串 www.google.com?Department=Education & Finance&Department=Health 我有这些 li 标签,它们的查询字符串是这样
我有一个带有静态构造函数的类,我用它来读取 app.config 值。如何使用不同的配置值对类进行单元测试。我正在考虑在不同的应用程序域中运行每个测试,这样我就可以为每个测试执行静态构造函数 - 但我
我正在寻找一个可以容纳多个键的容器,如果我为其中一个键值输入保留值(例如 0),它会被视为“或”搜索。 map, int > myContainer; myContainer.insert(make_
我正在为 Web 应用程序创建数据库,并正在寻找一些建议来对可能具有多种类型的单个实体进行建模,每种类型具有不同的属性。 作为示例,假设我想为“数据源”对象创建一个关系模型。所有数据源都会有一些共享属
(1) =>CREATE TABLE T1(id BIGSERIAL PRIMARY KEY, name TEXT); CREATE TABLE (2) =>INSERT INTO T1 (name)
我不确定在使用别名时如何解决不明确的列引用。 假设有两个表,a 和 b,它们都有一个 name 列。如果我加入这两个表并为结果添加别名,我不知道如何为这两个表引用 name 列。我已经尝试了一些变体,
我的查询是: select * from table where id IN (1,5,4,3,2) 我想要的与这个顺序完全相同,不是从1...5,而是从1,5,4,3,2。我怎样才能做到这一点? 最
我正在使用 C# 代码执行动态生成的 MySQL 查询。抛出异常: CREATE TABLE dump ("@employee_OID" VARCHAR(50)); "{"You have an er
我有日期 2016-03-30T23:59:59.000000+0000。我可以知道它的格式是什么吗?因为如果我使用 yyyy-MM-dd'T'HH:mm:ss.SSS,它会抛出异常 最佳答案 Sim
我有一个示例模式,它的 SQL Fiddle 如下: http://sqlfiddle.com/#!2/6816b/2 这个 fiddle 只是根据 where 子句中的条件查询示例数据库,如下所示:
我是一名优秀的程序员,十分优秀!