<legend id='mjkHP'><style id='mjkHP'><dir id='mjkHP'><q id='mjkHP'></q></dir></style></legend>
      <i id='mjkHP'><tr id='mjkHP'><dt id='mjkHP'><q id='mjkHP'><span id='mjkHP'><b id='mjkHP'><form id='mjkHP'><ins id='mjkHP'></ins><ul id='mjkHP'></ul><sub id='mjkHP'></sub></form><legend id='mjkHP'></legend><bdo id='mjkHP'><pre id='mjkHP'><center id='mjkHP'></center></pre></bdo></b><th id='mjkHP'></th></span></q></dt></tr></i><div id='mjkHP'><tfoot id='mjkHP'></tfoot><dl id='mjkHP'><fieldset id='mjkHP'></fieldset></dl></div>
    1. <tfoot id='mjkHP'></tfoot>

      <small id='mjkHP'></small><noframes id='mjkHP'>

      • <bdo id='mjkHP'></bdo><ul id='mjkHP'></ul>

      SwingWorker 没有响应

      时间:2023-09-30

      <legend id='FTJBT'><style id='FTJBT'><dir id='FTJBT'><q id='FTJBT'></q></dir></style></legend>

      <small id='FTJBT'></small><noframes id='FTJBT'>

        <i id='FTJBT'><tr id='FTJBT'><dt id='FTJBT'><q id='FTJBT'><span id='FTJBT'><b id='FTJBT'><form id='FTJBT'><ins id='FTJBT'></ins><ul id='FTJBT'></ul><sub id='FTJBT'></sub></form><legend id='FTJBT'></legend><bdo id='FTJBT'><pre id='FTJBT'><center id='FTJBT'></center></pre></bdo></b><th id='FTJBT'></th></span></q></dt></tr></i><div id='FTJBT'><tfoot id='FTJBT'></tfoot><dl id='FTJBT'><fieldset id='FTJBT'></fieldset></dl></div>
            <tbody id='FTJBT'></tbody>
            • <tfoot id='FTJBT'></tfoot>
                <bdo id='FTJBT'></bdo><ul id='FTJBT'></ul>

              • 本文介绍了SwingWorker 没有响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                问题描述

                我想做什么?

                点击Start JButtonSwingWorker就会执行.在 doInBackground() 方法内部,我将 arrNames 的每个索引传递给 publish() 方法,以便在内部显示JTextArea.

                At the click of the Start JButton, the SwingWorker will execute. Inside the doInBackground() method, I am passing each index of arrNames, to the publish() method, so that it can be displayed inside the JTextArea.

                发生了什么?

                如果我保留行 System.out.format("Counter : %d%n", counter); 作为评论,在我的 SwingWorkerdoInBackground() 方法中,SwingWorker 正在按预期工作.虽然如果我将其注释掉,那么 SwingWorker 停止响应.

                If I do not keep line System.out.format("Counter : %d%n", counter); as a comment, in my doInBackground() method of the SwingWorker, then the SwingWorker is working as expected. Though if I comment it out, then the SwingWorker stops responding.

                我做错了吗?

                java version "1.7.0_25"
                Java(TM) SE Runtime Environment (build 1.7.0_25-b16)
                Java HotSpot(TM) Client VM (build 23.25-b01, mixed mode, sharing)
                

                这是我正在使用的代码:

                Here is the code I am using :

                import java.awt.*;
                import java.awt.event.*;
                import javax.swing.*;
                
                public class SwingWorkerExample1
                {
                    private JLabel statusLabel;
                    private JTextArea tArea;
                    private JButton startButton;
                    private JButton stopButton;
                
                    private BackgroundTask backgroundTask;
                
                    private ActionListener buttonActions =
                                            new ActionListener()
                    {
                        @Override
                        public void actionPerformed(ActionEvent ae)
                        {
                            JButton source = (JButton) ae.getSource();
                            if (source == startButton)
                            {
                                startButton.setEnabled(false);
                                stopButton.setEnabled(true);
                                backgroundTask = new BackgroundTask();
                                backgroundTask.execute();
                            }
                            else if (source == stopButton)
                            {
                                backgroundTask.cancel(true);
                                stopButton.setEnabled(false);
                                startButton.setEnabled(true);
                            }
                        }
                    };
                
                    private void displayGUI()
                    {
                        JFrame frame = new JFrame("Swing Worker Example");
                        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                
                        JPanel contentPane = new JPanel();
                        contentPane.setBorder(
                            BorderFactory.createEmptyBorder(5, 5, 5, 5));
                        contentPane.setLayout(new BorderLayout(5, 5));
                
                        statusLabel = new JLabel("Status Bar", JLabel.CENTER);
                
                        tArea = new JTextArea(20, 20);
                        tArea.setWrapStyleWord(true);
                        tArea.setLineWrap(true);        
                        JScrollPane textScroller = new JScrollPane();
                        textScroller.setBorder(
                            BorderFactory.createTitledBorder("Textual OUTPUT : "));
                        textScroller.setViewportView(tArea);
                
                        startButton = new JButton("Start");
                        startButton.addActionListener(buttonActions);
                        stopButton = new JButton("Stop");
                        stopButton.setEnabled(false);
                        stopButton.addActionListener(buttonActions);
                        JPanel buttonPanel = new JPanel();
                        buttonPanel.add(startButton);
                        buttonPanel.add(stopButton);
                
                        contentPane.add(statusLabel, BorderLayout.PAGE_START);
                        contentPane.add(textScroller, BorderLayout.CENTER);
                        contentPane.add(buttonPanel, BorderLayout.PAGE_END);
                
                        frame.setContentPane(contentPane);
                        frame.pack();
                        frame.setLocationByPlatform(true);
                        frame.setVisible(true);
                    }
                
                    private class BackgroundTask extends SwingWorker<Void, String>
                    {
                        private int counter = 0;
                
                        private String[] arrNames = { "US Rates Strategy Cash",
                            "Pavan Wadhwa(1-212) 844-4597", "Srini Ramaswamy(1-212) 844-4983",
                            "Meera Chandan(1-212) 855-4555", "Kimberly Harano(1-212) 823-4996",
                            "Feng Deng(1-212) 855-2555", "US Rates Strategy Derivatives",
                            "Srini Ramaswamy(1-212) 811-4999",
                            "Alberto Iglesias(1-212) 898-5442",
                            "Praveen Korapaty(1-212) 812-3444", "Feng Deng(1-212) 812-2456",
                            "US Rates Strategy Derivatives", "Srini Ramaswamy(1-212) 822-4999",
                            "Alberto Iglesias(1-212) 822-5098",
                            "Praveen Korapaty(1-212) 812-3655", "Feng Deng(1-212) 899-2222" };
                
                        public BackgroundTask()
                        {
                            statusLabel.setText((this.getState()).toString());
                            System.out.println(this.getState());
                        }
                
                        @Override
                        protected Void doInBackground()
                        {
                            statusLabel.setText((this.getState()).toString());
                            System.out.println(this.getState());
                            while (!isCancelled())
                            {
                                counter %= arrNames.length;
                                //System.out.format("Counter : %d%n", counter);
                                publish(arrNames[counter]);
                                counter++;
                            }
                            statusLabel.setText((this.getState()).toString());
                            System.out.println(this.getState());
                            return null;
                        }
                
                        @Override
                        protected void process(java.util.List<String> messages)
                        {
                            for (String message : messages)
                                tArea.append(String.format(message + "%n"));
                        }
                    }
                
                    public static void main(String[] args)
                    {
                        Runnable runnable = new Runnable()
                        {
                            @Override
                            public void run()
                            {
                                new SwingWorkerExample1().displayGUI();
                            }
                        };
                        EventQueue.invokeLater(runnable);
                    }
                }
                

                编辑 1:

                按照建议,如果我添加 Thread.sleep(...),它确实可以工作,但它会抛出一个 InterruptedException,如下所示.所以这个技巧奏效了.但这是合法的执行方式吗?

                As suggested, if I add Thread.sleep(...), it does work, though, it throws a InterruptedException as shown below. So the trick works. But is this the legitimate way of performing it ?

                C:MineJAVAJ2SEclasses>java SwingWorkerExample1
                PENDING
                STARTED
                java.lang.InterruptedException: sleep interrupted
                        at java.lang.Thread.sleep(Native Method)
                        at SwingWorkerExample1$BackgroundTask.doInBackground(SwingWorkerExample1.java:108)
                        at SwingWorkerExample1$BackgroundTask.doInBackground(SwingWorkerExample1.java:76)
                        at javax.swing.SwingWorker$1.call(SwingWorker.java:296)
                        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
                        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
                        at javax.swing.SwingWorker.run(SwingWorker.java:335)
                        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
                        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
                        at java.lang.Thread.run(Thread.java:724)
                DONE
                

                <小时>

                编辑 2:

                只有 doInBackground() 发生了变化,引发了上述异常:


                EDIT 2 :

                Only doInBackground() is changed, that raised the above exception :

                @Override
                protected Void doInBackground()
                {
                    Runnable runnable = new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            statusLabel.setText((BackgroundTask.this.getState()).toString());
                        }
                    };
                    EventQueue.invokeLater(runnable);
                
                    System.out.println(this.getState());
                    while (!isCancelled())
                    {
                        counter %= arrNames.length;             
                        //System.out.format("Counter : %d%n", counter);
                        publish(arrNames[counter]);
                        try
                        {Thread.sleep(30);}
                        catch(InterruptedException ie)
                        {ie.printStackTrace();}
                        counter++;
                    }
                    runnable = new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            statusLabel.setText((BackgroundTask.this.getState()).toString());
                        }
                    };
                    EventQueue.invokeLater(runnable);
                    System.out.println(this.getState());
                    return null;
                }
                

                推荐答案

                如果我添加 Thread.sleep(...),它确实有效,但它会抛出一个中断异常

                if I add Thread.sleep(...), it does work, though, it throws a InterruptedException

                显然产生异常的代码(复制自 OP 的编辑):

                The code that apparently produces the exception (copied from OP's edit):

                while (!isCancelled()) {
                    counter %= arrNames.length;
                    // System.out.format("Counter : %d%n", counter);
                    publish(arrNames[counter]);
                    try {
                        Thread.sleep(30); // throws
                    } catch (InterruptedException ie) {
                        ie.printStackTrace();
                    }
                    counter++;
                }
                

                不过,原因是取消工作人员的代码(在 actionListener 中):

                The reason, though, is the code that cancels the worker (in the actionListener):

                backgroundTask.cancel(true);
                

                它明确告诉工作人员通过 .. 中断线程来取消.从它的 api 文档:

                which explicitly tells the worker to cancel by .. interrupting the thread. From its api doc:

                mayInterruptIfRunning - 如果执行此任务的线程应该被中断,则为 true;否则,允许完成正在进行的任务

                mayInterruptIfRunning - true if the thread executing this task should be interrupted; otherwise, in-progress tasks are allowed to complete

                顺便说一句:捕获异常并且什么都不做(从而有效地忽略中断)并不是最好的想法.在这种情况下可能不会造成太大的破坏 - 由于检查了取消的状态.典型的工作实现要么在需要时进行一些内部清理之后捕获并返回,要么根本不处理它.

                As an aside: catching the exception and doing nothing (thereby effectively ignoring the interrupt) is not the best of ideas. Probably not too damaging in this case - due to checking the cancelled status. Typical worker implementations either catch and return, after doing some internal cleanup if needed, or don't handle it at all.

                这篇关于SwingWorker 没有响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                上一篇:java, 以粗体打印 下一篇:如何在java中获取给定的日期字符串格式(模式)?

                相关文章

                最新文章

              • <small id='oHhBJ'></small><noframes id='oHhBJ'>

                <legend id='oHhBJ'><style id='oHhBJ'><dir id='oHhBJ'><q id='oHhBJ'></q></dir></style></legend>

                      <bdo id='oHhBJ'></bdo><ul id='oHhBJ'></ul>
                  1. <i id='oHhBJ'><tr id='oHhBJ'><dt id='oHhBJ'><q id='oHhBJ'><span id='oHhBJ'><b id='oHhBJ'><form id='oHhBJ'><ins id='oHhBJ'></ins><ul id='oHhBJ'></ul><sub id='oHhBJ'></sub></form><legend id='oHhBJ'></legend><bdo id='oHhBJ'><pre id='oHhBJ'><center id='oHhBJ'></center></pre></bdo></b><th id='oHhBJ'></th></span></q></dt></tr></i><div id='oHhBJ'><tfoot id='oHhBJ'></tfoot><dl id='oHhBJ'><fieldset id='oHhBJ'></fieldset></dl></div>

                  2. <tfoot id='oHhBJ'></tfoot>