Ho rifatto un po l'interfaccia grafica, la classe Mythread estende Thread e si limita a stampare il messaggio "Thread n" se il thread è l'n-esimo creato, quindi dorme un secondo e ritorna a stampare in un ciclo continuo.
I pulsanti disponibili sono:
new: crea un nuovo MyThread inserendolo nella JComboBox;
start: fa partire il Thread correntemete selezionato nella JComboBox;
interrupt: interrompe il Thread correntemente selezionato e lo elimina dalla JComboBox;
sleep: fa dormire il thread per 10 secondi ancizche per 1 secondo
Non so perchè ma non sono riuscito a terminare il thread invocandone il metodo interrupt; per ora ho ridefinito il metodo interrupt che setta una variabile booleana in modo da interrompere il cilo infinito.
Oltre ai pulsanti gli stessi comandi sono disponibili in un menu.
La classe principale che devi lanciare è ThreadExercise:
file ThreadExercise.java:
Codice PHP:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;
import javax.swing.border.*;
class MyThread extends Thread{
private static int MyThreadId = 0;
private int id;
private String message;
private JTextArea area;
private boolean goOn= true;
private boolean sleep = false;
public MyThread(String message, JTextArea area){
id = MyThreadId;
MyThreadId++;
this.message = message;
this.area = area;
}
public void run(){
for(;goOn != false; ){
System.out.println("Thread " + id);
area.append("Thread " + id + "\n");
int pos = area.getDocument().getLength();
try{
area.setCaretPosition(pos);
}
catch(IllegalArgumentException exc){
}
try{
if(! sleep)
sleep(2000);
else{
sleep(10000);
sleep = false;
}
}
catch(InterruptedException ex){
}
}
}
public void interrupt(){
goOn = false;
}
public void sleep(){
sleep = true;
}
public String toString(){
return "Thread " + id;
}
}
class ThreadFrame extends JFrame implements ActionListener{
private JLabel currentThreadLabel;
private JLabel lastActionLabel;
private JButton newButton;
private JButton startButton;
private JButton interruptButton;
private JButton sleepButton;
private Action newAction;
private Action startAction;
private Action interruptAction;
private Action sleepAction;
private JComboBox threadList;
private JTextArea messagesArea;
private JToolBar toolbar;
private JPanel statusBar;
public ThreadFrame(){
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
threadList = new JComboBox();
threadList.addActionListener(this);
threadList.setEditable(false);
createActions();
createButtons();
createToolbar();
createStatusBar();
createMenu();
messagesArea = new JTextArea();
messagesArea.setEditable(false);
messagesArea.setBackground(Color.BLACK);
messagesArea.setForeground(Color.WHITE);
getContentPane().add(new JScrollPane(messagesArea), "Center");
setTitle("Esercizio sui Thread");
setSize(450, 450);
getContentPane().add(toolbar, "North");
getContentPane().add(statusBar, "South");
show();
}
private void createActions(){
newAction = new AbstractAction("new"){
public void actionPerformed(ActionEvent e){
MyThread thread = new MyThread("", messagesArea);
threadList.addItem(thread);
threadList.setSelectedItem(thread);
lastActionLabel.setText("Created " + thread);
}
};
startAction = new AbstractAction("start"){
public void actionPerformed(ActionEvent e){
Object o = threadList.getSelectedItem();
if(o == null)
return;
Thread selectedThread = (Thread)o;
try{
selectedThread.start();
}
catch(Exception exx){
String s = selectedThread + " cannot be started: ";
messagesArea.append(s + exx + "\n");
}
lastActionLabel.setText("Started " + selectedThread);
}
};
interruptAction = new AbstractAction("interrupt"){
public void actionPerformed(ActionEvent e){
Object o = threadList.getSelectedItem();
if(o == null)
return;
threadList.removeItem(o);
Thread selectedThread = (Thread)o;
selectedThread.interrupt();
lastActionLabel.setText("Interrupted " + selectedThread);
}
};
sleepAction = new AbstractAction("sleep"){
public void actionPerformed(ActionEvent e){
Object o = threadList.getSelectedItem();
if(o == null)
return;
MyThread selectedThread = (MyThread)o;
selectedThread.sleep();
lastActionLabel.setText("Sleeping " + selectedThread);
}
};
}
private void createButtons(){
newButton = new JButton(newAction);
startButton = new JButton(startAction);
interruptButton = new JButton(interruptAction);
sleepButton = new JButton(sleepAction);
}
private void createToolbar(){
toolbar = new JToolBar();
toolbar.setRollover(true);
toolbar.add(newButton);
toolbar.add(startButton);
toolbar.add(interruptButton);
toolbar.add(sleepButton);
}
private void createStatusBar(){
currentThreadLabel = new JLabel("No Thread selected");
lastActionLabel = new JLabel("No action performed");;
statusBar = new JPanel(new GridLayout(1, 3, 10, 10));
statusBar.add(currentThreadLabel);
statusBar.add(threadList);
statusBar.add(lastActionLabel);
Border border = BorderFactory.createEmptyBorder(5, 5, 5, 5);
statusBar.setBorder(border);
}
private void createMenu(){
JMenuBar menubar = new JMenuBar();
JMenu actionsMenu = new JMenu("Actions");
menubar.add(actionsMenu);
actionsMenu.add(newAction);
actionsMenu.add(startAction);
actionsMenu.add(interruptAction);
actionsMenu.add(sleepAction);
setJMenuBar(menubar);
}
public void actionPerformed(ActionEvent e){
Object o = threadList.getSelectedItem();
if(o == null){
currentThreadLabel.setText("No Thread Selected");
return;
}
String s = "Selected ";
s = s + threadList.getSelectedItem().toString();
currentThreadLabel.setText(s);
}
}
class ThreadExercise{
public static void main(String[] args){
new ThreadFrame();
}
}