如何访问正在运行的线程/ runnable?

时间:2011-04-06 07:15:32

标签: java

我有一个线程正在运行但是从外面我无法绕过一个值来停止该线程。如何在Mytest()内发送false / true值或调用运行的线程公共方法?当我按下按钮1? 例如:thread.interrupt(); runnable.stop();runnable.start();

// Main
public class Main extends JFrame
{
  public static Runnable runnable;
  public static Thread thread;
  private JButton b1    = new JButton("Start/Stop");

  public void init() 
  {    
    //Execute a job on the event-dispatching thread:
    try {
       javax.swing.SwingUtilities.invokeAndWait(new Runnable() 
       {
         public void run() 
         {
            createGUI();
         }
        });
     } catch (Exception e) { 
       System.err.println("createGUI didn't successfully complete");
     }
  }

  public void createGUI()
  {
    Container cp = getContentPane();
    b1.addActionListener(new button1()); cp.add(b1);
    runnable = new Mytest();
    thread = new Thread(runnable);
    thread.start();
  }
}

// Button 1 - [problem to go  inside a running thread]
public class button1 implements ActionListener 
{
  public void actionPerformed(ActionEvent e) 
  {
    System.out.println("button pressed - need to access ");
      //thread.interrupt();       runnable.stop(); //or runnable.start();
  }
}

// Running - Thread
public class Mytest implements Runnable
{
  public static boolean onoff = false;
  public static boolean status = false;

  public void run()
  {
    while(true) 
    {
      if (onoff) 
      {
         return;
       } else { 
         if (status==false) System.out.println("running"); 
       }
    }
  }
  public static void stop() { status = true; onoff=true; }
  public static void start() { status = false; onoff = false; }
}

跟进(校对):

Step 1:

/* Main -  boot/startup */
public class Main extends JFrame
{
    public static Mytest runnable;  // wrong: public static Runnable runnable;
    public static Thread thread;
    private JButton b1    = new JButton("Start");
    private JButton b2    = new JButton("Stop");  

  public void init() 
  {    
    // Execute a job on the event-dispatching thread:
    // In case Freezed for heavy lifting
    try {
       javax.swing.SwingUtilities.invokeAndWait(new Runnable() 
       {
         public void run() 
         {
            createGUI();
         }
       });
     } catch (Exception e) { 
       System.err.println("createGUI didn't successfully complete");
     }
  }

  public void createGUI()
  {
    Container cp = getContentPane();
    b1.addActionListener(new button1()); 
    cp.add(b1);

    runnable = new Mytest();
    thread = new Thread(runnable);    
        try {
                thread.sleep(100);  // value is milliseconds        
                thread.start();     
        } catch (InterruptedException e) {              
        }
  }

  public static void main(String[] args)
  {        
    run(new Main(), 500, 500);
  }

  public static void run(JFrame frame, int width, int height) 
  {        ...
    frame.setVisible(true);
  }
}

/* To start */
public class button1 implements ActionListener 
{
  public void actionPerformed(ActionEvent e) 
  {
    runnable.start();
  }    
}

/* To stop */
public class button2 implements ActionListener 
{
  public void actionPerformed(ActionEvent e) 
  {
    runnable.stop();
  }    
}

Step 2:

/* Thread deals */
public class Mytest implements Runnable
{
  private static volatile boolean running = true;

  public void run()
  {
    while(running) 
    {
      // do stuff
    }
  }
  public void start() { running = true; }
  public void stop()  { running = false;}
}

5 个答案:

答案 0 :(得分:8)

如果您按类而不是Runnable定义它,则可以调用实例方法。

public static Mytest runnable;

另请注意,由于多个内核具有自己的关联内存,因此您需要警告处理器可能会在另一个处理器上更改状态,并且需要注意该更改。听起来很复杂,但只需将'volatile'关键字添加到布尔标志

即可
public class Mytest implements Runnable
{
  private static volatile boolean running = true;

  public void run()
  {
    while(running) {
      // do stuff
    }
  }

  public void stop() { running = false;}
}

在初始代码中启动Runnable,然后使用runnable.stop()

关闭它

答案 1 :(得分:6)

您应该始终使用中断方法来停止线程。这是一种安全且适合执行线程停止操作的方法。

Thread tThread = new Thread(new Runnable() {

                public void run() {
                        while (!Thread.currentThread().isInterrupted()) {
                        try{
                        Thread.sleep(10);
                        ... do you stuff...
                        }catch(InterruptedException ex){

                            break;
                        }
                    }

                }

            });
    tThread.start();

当你想停止线程时,只需调用中断方法:

tThread.interrupt();

答案 2 :(得分:3)


public void run()
  {
    while(!isInterrupted()) {
      if (onoff) {
         return;
       } else { 
         if (status==false) System.out.println("running"); 
       }
    }
  }


然后使用Thread.interrupt()来表示线程的交叉。

注意:在任何情况下都不要使用Thread.stop()!这是已弃用
有关更多详细信息,请参阅JDK文档和<< Java Concurrency in Practice>>可以参考。

答案 3 :(得分:2)

在你的跑步方法......

不要做(真)...

使用boolean ... like ... while(threadIsRunning)

这个布尔值你可以设置为true / false ....

答案 4 :(得分:1)

除此之外,该线程是CPU的加热测试;)

您可以使用

调用启动/停止方法
 MyThread.start();
 MyThread.stop();

您已将它们定义为static方法,因此上面的代码行显示了如何调用它们。

加热...添加类似

的内容
try {
    Thread.sleep(100);  // value is milliseconds
} catch (InterruptedException e) {
    // no need to handle (in this example)
}

这会将CPU负载从100%(在一个核心上)减少到合理的值;)