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

我有一个线程正在运行,但从外面我不能绕过一个值来停止该线程。 如何在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;} } 

如果您按类而不是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()其关闭

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

 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(); 
public void run() { while(!isInterrupted()) { if (onoff) { return; } else { if (status==false) System.out.println("running"); } } }
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 >>。

在你的运行方法中……

不要做(真)..

使用布尔…比如… while(threadIsRunning)

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

除了这个事实,这个线程是你的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%(在一个核心上)减少到合理的值;)