[英]how to access the thread running the Runnable inside a Runnable class but outside of the run method?
[英]How to access the running thread/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");
}
}
}
然后使用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%(在一个核心上)减少到合理的值;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.