线程声明

时间:2013-03-25 01:48:03

标签: java multithreading swing user-interface declaration

我有以下代码:

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

public class Try extends JFrame implements ActionListener{
JButton n1 = new JButton("1");
JButton n2 = new JButton("2");
JButton n3 = new JButton("3");
JButton show = new JButton("Show");

{
show.addActionListener(this);
n1.setEnabled(false);
n2.setEnabled(false);
n3.setEnabled(false);

}

public Try(){
  super("Try");
  setVisible(true);
  setSize(500, 200);
  setLayout(new GridLayout(1, 4));
  add(n1);
  add(n2);
  add(n3);
  add(show);
}  

public void actionPerformed(ActionEvent a) {
Object clicked = a.getSource();
if(show == clicked){
new Trial().start();
}
}

class Trial extends Thread{
  public void run(){
        try {
            n1.setEnabled(true);
            Thread.sleep(1000);
            n1.setEnabled(false);
            n2.setEnabled(true);
            Thread.sleep(1000);
            n2.setEnabled(false);
            n3.setEnabled(true);
            Thread.sleep(1000);
            n3.setEnabled(false);    
        } catch (InterruptedException e){
        }
}
}      

    public static void main(String[] args){
      Try frame = new Try();
      frame.setVisible(true);
    }
    }

我对这些部分有一些疑问:

1.--->     new Trial().start();
2.--->     class Trial extends Thread
3.--->     public void run()
  1. 他为什么要新手而不只是试用?或者第1行是一个“制作”线程的代码?是在线程中启动一个方法来创建它们吗?
  2. 为什么要扩展线程?为什么不能简单地上课?还有为什么不公开?
  3. 为什么要公开?据我所知,run运行线程但为什么要公开?
  4. 提前致谢

2 个答案:

答案 0 :(得分:1)

你应该在网上轻松阅读一些关于java线程的精彩教程,经过一些研究后你可以找到你的答案,你必须先在这里发表你的问题。

您的问题的简短答案是;

new Trial().start();

new关键字是一个java运算符,它创建类对象,start()是开始执行线程。它也可以这样写出来;

Trial t = new Trial();
t.start();

所以这意味着,每当你创建一个扩展Thread的类的对象时,就会创建一个新的线程,当你调用start()

时它将开始执行
class Trial extends Thread

类试验是扩展Thread类以继承行为,并且能够为自己的实现覆盖run()函数。简单来说,run()是Thread完成所有工作的函数。

public void run()

run()函数在派生类中被重写(即在你的情况下是Trial),所以它必须是公共的,这样你就可以在创建Trial类对象的任何地方创建和启动一个线程。

希望它有所帮助。

答案 1 :(得分:1)

同样,你的Swing线程出错了,但无论如何,我甚至不会直接使用线程,而是会使用Swing Timer。例如:

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

public class Try extends JFrame implements ActionListener {
   private static final int TIMER_DELAY = 1000;
   JButton n1 = new JButton("1");
   JButton n2 = new JButton("2");
   JButton n3 = new JButton("3");
   private JButton[] buttons = {n1, n2, n3};
   JButton show = new JButton("Show");
   private Timer timer = null;

   public Try() {
      super("Try");
      // setSize(500, 200);
      setLayout(new GridLayout(1, 4));
      add(n1);
      add(n2);
      add(n3);
      add(show);

      show.addActionListener(this);
      n1.setEnabled(false);
      n2.setEnabled(false);
      n3.setEnabled(false);

      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      pack();
   }

   public void actionPerformed(ActionEvent a) {
      Object clicked = a.getSource();
      if (show == clicked && timer == null) {
         timer = new Timer(TIMER_DELAY, new TimerListener());
         timer.setInitialDelay(0);
         timer.start();
      }
   }

   private class TimerListener implements ActionListener {
      private int count = 0;

      @Override
      public void actionPerformed(ActionEvent evt) {
         for (JButton btn : buttons) {
            btn.setEnabled(false);
         }

         if (count != buttons.length) {
            buttons[count].setEnabled(true);
            count++;
         } else {
            timer.stop();
            timer = null;
         }
      }
   }

   private static void createAndShowGui() {
      new Try().setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}