我用按钮调用了一个无限循环的线程,线程内部设置有跳出线程的stop函数,可是当按下按钮,线程一直运行,按钮焦点就会一直被占用,主线程会一直等待按钮线程结束,这就永远无法实现线程结束。出现这样的问题该如何解决呀?我的程序必须实现这样的一个调用。各位大神求解答啊!
没有把thread写在Button内,而是单独写的。使用的时候是点击Button监听器内部的代码是先实例化线程类再调用run()方法,结束就调用里面的stop()方法。关键是当按下按钮,程序就运行线程里面的run()代码,也许这时候主线程已经结束,所以无法调用到stop()方法来实现线程的停止。这样的情况该把stop()方法放在哪儿调用,一开始我放在run()方法的内部调用,显然这样没有成功。
追答主线程不会结束,你的面板还在你的主线程就在,问题的根源在于你实例化的地方不对,如果你在buttonA的事件里面实例化这个线程,那么你怎么能让buttonB来访问这个线程呢,所以你需要在button的面板类上面申明这个线程的变量
以下伪代码供参考
class MainFrame extends .......{
MyThread mt;
Button a=new JButton("start");
Button b=new JButton("stop");
a.AddClickListener(new Event{
mt=new MyThread();
mt.start();
});
b.AddClickListener(new Event{
mt.setStop(true);
});
......
}
我大概就是这么做的,线程我放在一个单独的类里面。使用的时候是先实例化再调用run()方法,结束就调用里面的stop()方法。关键是当按下按钮,程序就运行线程里面的run()代码,也许这时候主线程已经结束,所以无法调用到stop()方法来实现线程的停止。这样的情况该把stop()方法放在哪儿调用,一开始我放在run()方法的内部调用,显然这样没有成功。不知还有没有别的办法?
你可以这样:
//Runnable内run()方法在按钮事件中来修改flag值:
这样可通过变量的设置来控制循环。
追问我大概就是这么做的,线程我放在一个单独的类里面。使用的时候是先实例化再调用run()方法,结束就调用里面的stop()方法。关键是当按下按钮,程序就运行线程里面的run()代码,也许这时候主线程已经结束,所以无法调用到stop()方法来实现线程的停止。这样的情况该把stop()方法放在哪儿调用,一开始我放在run()方法的内部调用,显然这样没有成功。不知还有没有别的办法?
追答你新建的线程和按钮的监听线程是并行的,stop方法与run方法是并列的,它属于那个线程类,不知道可不可以看下你的代码,如果不方便的话,你可以把那个线程类的run方法和stop方法看看。
追问你那个run方法根本就不是Thread里的run,你这个是你自己方法,要覆盖Thread内的run方法,他是没有参数的,调用的话用myThread.start()来表示启动线程,这样的不是多线程的,所以才会卡在那儿,没办法停下。你再看看多线程的创建吧。
java如何使用按钮调用无限循环线程且如何结束
可能是你的架构设计的不太好,你直接用按钮类继承了thread并把逻辑直接写到了button类里面了?按理说你的button类只有一个new somethread().start()函数就好了这个线程应该影响不到你的button的
请问如何实现点击按钮运行循环语句时就弹出一个提示语句,如“正在查询...
自己百度谷歌多线程读取数据等待 这个很简单 Java:Button bt = new Button("Button");bt.setOnClickListener( new Button.OnClickedListener() { mProgressBar = new ProgressBar(); mProgressBar->setText("正在查询中,请稍后……"); mProgressBar.setVisibility(View.VISIBLE); Thr...
Java 单击按钮控制while循环停止
1,你肯定是启动了main方法,循环执行某些任务,由于time>0 是一个true条件,所以你一直关闭不了。2,即使加了一个标记位,如一个按钮使得time<0,但是在点按钮的时候却没有反应 3,这种问题就是多线程问题,你只有启动另外一个线程,当点击按钮时,改变那个标记位time的值 time=-1;这样才可以 ...
在Java中如何使程序一直循环,但是可以选择是否结束程序,最好有例...
import java.util.Scanner;public class TestXH { public static void main(String[] args) { Scanner scn = new Scanner(System.in);String in = "";for (;; in = scn.next()) { System.out.println("结束循环请输入 'Y'");if ("Y".equals(in) || "y".equals(in)) { System.o...
Java中如何终止运行中的线程?while(true){i++;}死循环是如何跳出的?
首先,可以使用volatile标志位。创建一个Runnable接口的实现类,其中定义一个volatile标志位,利用这个标志位控制线程的运行。在main方法中创建线程,适当时候修改标志位以终止线程。其次,可以使用interrupt()方法中断线程。调用interrupt()方法在当前线程中打一个停止标记,并非立即终止线程,而是通知目标线程希望...
java 点击按钮 跳出while循环
定义一个类的变量(可以是静态的),while循环的时候判断这个值,默认是继续循环。按钮的点击事件去把这个类的变量改值掉,就能退出循环了
如何正确结束Java线程
1. 使用退出标志终止线程 当run方法执行完后,线程就会退出。但有时run方法是永远不会结束的。如在服务端程序中使用线程进行监听客户端请求,或是其他的需要循环处理的任务。在这种情况下,一般是将这些任务放在一个循环中,如while循环。如果想让循环永远运行下去,可以使用while(true){……}来处理。...
Java中如何正确而优雅的终止运行中的线程
如下:第1个线程创建第2个线程创建第3个线程创建---第2个线程终止第1个线程终止第3个线程终止3、使用interrupt()中断的方式,注意使用interrupt()方法中断正在运行中的线程只会修改中断状态位,可以通过isInterrupted()判断。如果使用interrupt()方法中断阻塞中的线程,那么就会抛出InterruptedException异常,可...
java中 按钮触发循环事件后 所有按钮都不响应了
上面两位分析的是对的,看你代码中的这一行:Thread.sleep(250);你是采用单线程设计的程序,当执行这一句之后,程序当sleep,如果此时你点击按钮,它当然没有响应了,而且,这种sleep还得无限死循环的执行下去。需要将这一部分第250毫秒就改变一次颜色的代码放到一个新的线程中执行。
java线程关闭时会执行结束线程的方法吗
当你调用System.exit()或者通过其他方式(例如:在Spring Boot应用中使用\/shutdown端点)正常关闭应用时,Java虚拟机会尝试停止所有的非守护线程。如果线程在合理的时间内没有响应停止请求,那么Java虚拟机会使用更强硬的手段来停止它们。你可以通过在线程上调用Thread.interrupt()方法来中断线程。这将设置线程...