2013-05-08 138 views
1

我需要编写一个JApplet停止方法,该方法通过在applet最小化时向第二个线程发送suspend()消息来挂起第二个线程。然后,当小程序未被最小化时,我必须恢复线程。在applet中挂起线程

import javax.swing.*; 
import java.awt.*; 

public class StopResume extends JApplet 
{ 
    private final static int THREADS = 3; 
    private Counter[] t = new Counter[THREADS]; 
    private JTextField[] tf = new JTextField[THREADS]; 

    public void init() 
    { 
    final int TEXTFIELD_SIZE = 5; 
    JLabel title = new JLabel("JTextFields are changed by different threads."), 
      subtitle = new JLabel("Minimizing applet results in -"); 
    JLabel[] labels = { 
         new JLabel("Thread#1 being stopped, count gets reset: "), 
         new JLabel("Thread#2 being suspended, count resumed:"), 
         new JLabel("Thread#3 not affected, count continues:  ") 
         }; 
    Container c = getContentPane(); 

    c.setLayout(new FlowLayout()); 
    c.add(title); 
    c.add(subtitle); 
    for (int i = 0; i < THREADS; i++) 
    { 
     tf[i] = new JTextField(TEXTFIELD_SIZE); 
     c.add(labels[i]); 
     c.add(tf[i]); 
     t[i] = new Counter(tf[i]); 
     t[i].start(); 
    } 
    } // End of init method definition 
    public void stop() 
    { 

    } 

    public void start() 
    { 

    } 
} // End of StopResume class definition 

class Counter extends Thread 
{ 
    private JTextField tf; // the JTextField where the thread will write 

    public Counter(JTextField tf) 
    { 
    this.tf = tf; 
    } 

    public void run() 
    { 
    final int ONE_SECOND = 1000; // in milliseconds 

    for (int i = 0; i < Integer.MAX_VALUE; i++) 
    { 
     tf.setText(Integer.toString(i)); 
     try 
     { 
     sleep(ONE_SECOND); 
     } 
     catch(InterruptedException ie) 
     { 
     } 
    } 
    } // End of run method definition 
} // End of Counter class definition 
+1

你已经描述了一个问题,但至今没有问过问题(更不用说具体的可回答的问题)。你的问题是什么? – 2013-05-09 02:50:33

+0

suspend()是一个不推荐的方法。 http://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html – vptheron 2013-05-09 13:57:12

回答

1

您可以使用标志和休眠循环来实现挂起功能。

新的布尔字段添加到您的Counter螺纹:

private volatile boolean isSuspended = false; 

添加控制方法Counter螺纹:

public suspendCounter() { 
    isSuspended = true; 
} 

public resumeCounter() { 
    isSuspended = false; 
} 

把额外的睡眠循环到你的run方法,迭代而isSuspended是:

for (int i = 0; i < Integer.MAX_VALUE; i++) { 
    tf.setText(Integer.toString(i)); 
    try { 
     sleep(ONE_SECOND); 
    } catch(InterruptedException ie) { 
    } 
    while (isSuspended) { 
     try { 
      sleep(100); 
     } catch(InterruptedException ie) { 
     } 
    } 
}