2013-05-08 3 views
1

Мне нужно написать метод остановки JApplet, который приостанавливает второй поток, отправив сообщение suspend() во второй поток, когда апплет свернут. Затем я должен возобновить поток, когда апплет не ограничен.Suspending Threads in 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

Вы описали проблему, но до сих пор не задавали вопрос (не говоря уже о конкретном, ответственном вопросе). Какой у Вас вопрос? –

+0

suspend() - устаревший метод. http://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html – vptheron

ответ

1

Вы можете реализовать функцию приостановки с использованием флага и спального цикла.

Добавить новое булево поле для вашей Counter темы:

private volatile boolean isSuspended = false; 

Добавить методы управления в Counter нити:

public suspendCounter() { 
    isSuspended = true; 
} 

public resumeCounter() { 
    isSuspended = false; 
} 

Поместите дополнительный цикл сна в ваш метод выполнения, который перебирает в то время как 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) { 
     } 
    } 
}