दिलचस्प पोस्ट
पॉपेन () विकल्प क्या आईओडी के साथ डोम ट्री तत्व ग्लोबल वैरिएबल बनते हैं? ReactJS आवेदन – लचीलाता वीएस तेजी से विफल .Net Array के आकार पर सीमा प्रिंट सीएसएस की स्थापना के लिए अच्छे नियम हैं? जावा के बराबर सी # के शब्दशः स्ट्रिंग @ स्ट्रिंग को जावा में पूर्ण सरणी में कनवर्ट करें सरणीफ़्लॉट मैटैब में स्पष्ट लूप की तुलना में काफी धीमी गति से हो सकता है। क्यूं कर? क्या एक पूरे आवेदन के लिए संस्कृति स्थापित करने का एक तरीका है? सभी वर्तमान धागे और नए धागे? समान चौड़ाई के दो बटन सेट की सहायता की आवश्यकता log4j: सॉकेट अपैपर का उपयोग कैसे करें? कमानों को अलग करने के लिए कॉलम मूल्यों को पंक्तियों में कनवर्ट करें सरणी से सभी अनूठे तत्व प्राप्त करने के लिए jQuery फ़ंक्शन? कैसे यूक्लिडियन दूरी को numpy के साथ गणना की जा सकती है? आर में कॉलम-वैक्टर की सूची में मैट्रिक्स कैसे परिवर्तित करें?

कई स्विंगवर्कर्स की प्रतीक्षा कर रहा है

कृपया निम्नलिखित कोड खंड पर विचार करें:

import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.reflect.InvocationTargetException; import javax.swing.*; public class TestApplet extends JApplet { @Override public void init() { try { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { createGUI(); } }); } catch(InterruptedException | InvocationTargetException ex) { } } private void createGUI() { getContentPane().setLayout(new FlowLayout()); JButton startButton = new JButton("Do work"); startButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { JLabel label = new JLabel(); new Worker(label).execute(); } }); getContentPane().add(startButton); } private class Worker extends SwingWorker<Void, Void> { JLabel label; public Worker(JLabel label) { this.label = label; } @Override protected Void doInBackground() throws Exception { // do work return null; } @Override protected void done() { getContentPane().remove(label); getContentPane().revalidate(); } } } 

यहां एप्लेट के लिए एक लेबल जोड़ता है जो वर्कर थ्रेड के कुछ इंटरमीडिएट परिणाम दिखाता है (प्रकाशित / प्रक्रिया पद्धतियों का उपयोग करके)। अंत में, लेबल को एप्लेट के फलक से हटा दिया जाता है। मेरा प्रश्न यह है कि, मैं कई लेबल्स कैसे बना सकता हूं, प्रत्येक अपने स्वयं के कार्यकर्ता धागा के साथ, और जब वे सभी कर लेंगे तो उन्हें हटा दें?

अग्रिम में धन्यवाद।

अद्यतन करें:

मुझे उम्मीद है कि यह मेरे प्रश्न को स्पष्ट करेगा मैं चाहता हूं कि लेबल को एक बार में हटा दिया जाए, जब सभी कार्यकर्ता अपना कार्य पूरा कर लेंगे, तुरंत प्रत्येक कार्यकर्ता के समाप्त होने के बाद नहीं।

अद्यतन 2:

निम्नलिखित कोड ऐसा कर रहा है जो मुझे चाहिए। कृपया टिप्पणी करें कि मैंने इसे सही तरीके से किया था। मुझे लगता है कि कुछ गलत है एक समस्या यह है कि बटन के दाईं ओर के लेबल दिखाई देते हैं, हालांकि उन्हें हटा दिया जाता है। सेट विसइबल (झूठी) इस समस्या को हल करने के लिए लगता है। क्या ऐसा करने का तरीका है?

 import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.reflect.InvocationTargetException; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.*; public class TestApplet extends JApplet { private Queue<JLabel> labels = new LinkedList<>(); private static final Random rand = new Random(); @Override public void init() { try { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { createGUI(); } }); } catch(InterruptedException | InvocationTargetException ex){} } private void createGUI() { getContentPane().setLayout(new FlowLayout()); JButton startButton = new JButton("Do work"); startButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { ExecutorService executor = Executors.newFixedThreadPool(10); for(int i = 0; i < 10; i++) { JLabel label = new JLabel(); getContentPane().add(label); executor.execute(new Counter(label)); } } }); getContentPane().add(startButton); } private class Counter extends SwingWorker<Void, Integer> { private JLabel label; public Counter(JLabel label) { this.label = label; } @Override protected Void doInBackground() throws Exception { for(int i = 1; i <= 100; i++) { publish(i); Thread.sleep(rand.nextInt(80)); } return null; } @Override protected void process(List<Integer> values) { label.setText(values.get(values.size() - 1).toString()); } @Override protected void done() { labels.add(label); if(labels.size() == 10) { while(!labels.isEmpty()) getContentPane().remove(labels.poll()); getContentPane().revalidate(); } } } } 

वेब के समाधान से एकत्रित समाधान "कई स्विंगवर्कर्स की प्रतीक्षा कर रहा है"

जब सभी श्रमिक अपना कार्य पूरा कर लेते हैं, तब मैं सभी लेबल को एक साथ निकालने का इरादा रखता हूं

जैसा कि यहाँ वर्णित है , एक CountDownLatch इस संदर्भ में अच्छी तरह से काम करता है। नीचे दिए गए उदाहरण में, प्रत्येक कार्यकर्ता पूरा होने पर latch.countDown() को आमंत्रित करता है, और एक Supervisor कार्यकर्ता को latch.await() पर सभी कार्यों को पूरा करने तक रोकता है। प्रदर्शन के प्रयोजनों के लिए, Supervisor लेबल को अद्यतन करता है टिप्पणी में दिखाया गया थोक हटाने, तकनीकी रूप से संभव है, लेकिन आमतौर पर अपरिहार्य है। इसके बजाय, एक JList या JTable पर विचार करें

कार्यकर्ता कुंडी परीक्षण

 import java.awt.Color; import java.awt.EventQueue; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.*; /** * @see https://stackoverflow.com/a/11372932/230513 * @see https://stackoverflow.com/a/3588523/230513 */ public class WorkerLatchTest extends JApplet { private static final int N = 8; private static final Random rand = new Random(); private Queue<JLabel> labels = new LinkedList<JLabel>(); private JPanel panel = new JPanel(new GridLayout(0, 1)); private JButton startButton = new JButton(new StartAction("Do work")); public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame(); frame.setTitle("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new WorkerLatchTest().createGUI()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } @Override public void init() { EventQueue.invokeLater(new Runnable() { @Override public void run() { add(new WorkerLatchTest().createGUI()); } }); } private JPanel createGUI() { for (int i = 0; i < N; i++) { JLabel label = new JLabel("0", JLabel.CENTER); label.setOpaque(true); panel.add(label); labels.add(label); } panel.add(startButton); return panel; } private class StartAction extends AbstractAction { private StartAction(String name) { super(name); } @Override public void actionPerformed(ActionEvent e) { startButton.setEnabled(false); CountDownLatch latch = new CountDownLatch(N); ExecutorService executor = Executors.newFixedThreadPool(N); for (JLabel label : labels) { label.setBackground(Color.white); executor.execute(new Counter(label, latch)); } new Supervisor(latch).execute(); } } private class Supervisor extends SwingWorker<Void, Void> { CountDownLatch latch; public Supervisor(CountDownLatch latch) { this.latch = latch; } @Override protected Void doInBackground() throws Exception { latch.await(); return null; } @Override protected void done() { for (JLabel label : labels) { label.setText("Fin!"); label.setBackground(Color.lightGray); } startButton.setEnabled(true); //panel.removeAll(); panel.revalidate(); panel.repaint(); } } private static class Counter extends SwingWorker<Void, Integer> { private JLabel label; CountDownLatch latch; public Counter(JLabel label, CountDownLatch latch) { this.label = label; this.latch = latch; } @Override protected Void doInBackground() throws Exception { int latency = rand.nextInt(42) + 10; for (int i = 1; i <= 100; i++) { publish(i); Thread.sleep(latency); } return null; } @Override protected void process(List<Integer> values) { label.setText(values.get(values.size() - 1).toString()); } @Override protected void done() { label.setBackground(Color.green); latch.countDown(); } } } 

जो कोड आपके पास है वह पहले से कुछ हद तक कर रहा है। बटन क्लिक होने पर आपको वास्तव में सामग्री को लेबल में जोड़ने की आवश्यकता है कुछ इस तरह:

  JLabel label = new JLabel(); getContentPane().add(label); getContentPane().validate(); new Worker(label).execute(); 

लेबल में कुछ पाठ डालने का यह एक अच्छा विचार हो सकता है ताकि स्क्रीन पर यह जोड़ा जा सके कि आप इसे वास्तव में देखते हैं।

  JLabel label = new JLabel("Hello...I am here"); 

और अंत में doInBackground () विधि में आप लेबल को अपडेट करने के लिए कुछ कोड जोड़ सकते हैं क्योंकि कुछ कार्य चल रहा है:

  for(int i = 0;i < 100; i++){ Thread.sleep(20); label.setText("Counting..." + i); } 

इस तरह आप वास्तव में कार्य चल रहे हैं। यदि आप कई बार बटन पर क्लिक करते हैं तो आपको कई लेबल दिखाई देते हैं और कार्य पूर्ण होने के बाद प्रत्येक व्यक्ति गायब हो जाता है।