0 0

为什么停止按钮触发后线程还能够执行,怎样才能够让线程停下来?5

 

程序如下:代码比较简单,问题是我在ButtonTest中的startbutton,endButton两个按钮增加了监听器,点击startbutton可以执行ButtonTestThread里面的方法,然而点击endButton后却不能使ButtonTestThread停下来,但是我已经把ButtonTestThread要执行的循环条件变成false了呀,为什么呢?难道这样设置没有用吗?我试过在打印信息里面加了那个循环的条件,即stop的真假,而打印出来的stop是假却也会一直执行下去,为什么呀,怎样才能让stop按钮起作用呢?

package com.shc.test.button;

 

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

 

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

 

public class ButtonTest extends JFrame{

 

private JButton startbutton = new JButton("开始");

private JButton endButton = new JButton("停止");

private JTextArea jTextAera = new JTextArea();

private JScrollPane scroll = new JScrollPane(jTextAera);

private ButtonTestThread thread1;

private Boolean stop;

public ButtonTest(){

super("a按钮测试");

getContentPane();

setLayout(new GridLayout(3,1));

add(scroll);

add(startbutton);

add(endButton);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setBounds(300, 150, 150, 150);

startbutton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

//开始运行线程

stop = true;

thread1 = new ButtonTestThread(jTextAera,stop);

thread1.start();

}

});

endButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

// 此处已经设置成false,为什么ButtonTestThread线程还能够运行呢?

thread1.setStop(false);

jTextAera.append("\n停止打印");

}

});

}

public static void main(String[] args) {

           new ButtonTest();

}

 

}

 

 

 

 

 

 

 

 

package com.shc.test.button;

 

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;

 

import javax.swing.JTextArea;

 

public class ButtonTestThread extends Thread{

private JTextArea jte;

private ExecutorService service;

private boolean stop;

public void run(){

service = Executors.newSingleThreadScheduledExecutor();

service.submit(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

while(stop){

for(int i= 0;i<20;i++){

jte.append("\n运行到:"+ i+stop);

   try {

TimeUnit.MILLISECONDS.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

   if(i==19) service.shutdown();

}

}

}

});

}

public ButtonTestThread(JTextArea jte,boolean stop) {

super();

this.jte = jte;

this.stop = stop;

}

public void setStop(boolean stop){

this.stop = stop;

}

 

}


2012年3月22日 20:36

1个答案 按时间排序 按投票排序

0 0

你不是写了for循环了么
for循环全部结束后才会再判断while(stop)啊。
当然不可能马上生效了,你把for循环去掉就马上生效了。

2012年3月23日 08:39

相关推荐

    PyQt5多线程的执行和停止

    我们可以为每个线程设置开始、暂停、恢复和停止的信号,通过连接这些信号到对应的槽,控制线程的执行状态。 进度条(QProgressBar)是可视化反馈用户线程执行进度的重要工具。每个线程在执行过程中,可以通过更新...

    VC\专用编程\线程\vc编程,多线程实例线程创建·事件触发·结束进程.rar

    手动重置事件在被触发后,直到显式重置才会再次允许其他线程通过;而自动重置事件一旦被触发,会立即让一个等待的线程继续,然后自动回到未触发状态。 4. **线程的生命周期管理**: 创建线程后,需要关注线程的...

    线程异步工作,当一个线程结束时异步通知另一线程

    在多线程编程中,线程间的协作是关键任务之一,尤其当需要一个线程在完成特定工作后通知另一个线程继续执行时。这个过程通常涉及到线程同步和异步的概念。本文将深入探讨线程异步工作以及如何在C++中实现一个线程在...

    C#多线程并行管理,通过Task实现,可随时暂停,继续以及停止等

    当调用`CancellationTokenSource.Cancel()`时,关联的`CancellationToken`会被设置为已取消状态,从而让任务知道应停止执行。 实现这一功能的基本步骤如下: 1. 创建`CancellationTokenSource`: `var cts = new ...

    c# 多线程任务中结束全部线程

    在C#中,多线程是程序设计中的一个重要概念,它允许程序同时执行多个...在处理多线程任务时,特别需要注意的是线程安全性和资源管理,确保所有线程都能够正确地启动、执行和终止,避免出现死锁、资源泄漏等常见问题。

    Winform基于多线程实现每隔1分钟执行一段代码

    【Winform基于多线程实现每隔1分钟执行一段代码】的知识点主要集中在以下几个方面: 1. **多线程**:在Windows Forms(Winform)应用中,为了不影响UI线程的响应,通常会使用多线程来执行长时间或计算密集型的任务...

    Qt5的多线程小程序,实现按钮开关线程

    标题为“Qt5的多线程小程序,实现按钮开关线程”,这意味着我们将深入探讨如何在Qt中通过按钮操作启动和停止线程,这对于理解多线程应用的交互性至关重要。 首先,我们要了解Qt5中的线程模型。Qt5提供了两种主要的...

    易语言利用Event事件实现多线程暂停继续源码

    在实现线程暂停和继续功能时,通常使用手动重置事件,因为我们需要在线程暂停后能够独立地控制其继续执行。 首先,我们需要创建一个Event对象,然后在线程的执行代码中,当需要暂停线程时,调用Event对象的“等待”...

    pb9多线程控件,能够真实实现多线程

    标题中的“pb9多线程控件”指的是在PowerBuilder 9.0(PB9)环境中,使用的一种能够实现真正多线程功能的组件或技术。PowerBuilder是一款经典的面向对象的开发工具,主要用于构建数据库应用系统。在PB的早期版本中,...

    QTimer在子线程里执行例子

    在多线程编程中,有时我们需要在子线程中使用定时器来执行某些任务,以避免阻塞主线程,提高程序的响应性和效率。`QTimer`在子线程中的使用涉及到Qt的线程模型和事件循环。下面我们将详细探讨如何在子线程中使用`...

    易语言线程返回数据的方法

    2. **事件机制**:线程执行完后,可以通过触发一个事件,将结果传递给事件处理程序。这种方式适合异步操作,能避免阻塞主线程。 3. **共享数据结构**:线程可以将结果存入一个共享数据结构(如数组或链表),然后...

    C# 如何挂起线程、休眠线程和终止线程(源码例)

    休眠线程是让线程暂时停止执行,等待一段时间后再继续。C#提供了`Thread.Sleep()`方法来实现这一功能。例如,如果你希望线程暂停5秒,可以写成`Thread.Sleep(5000)`。这会使得线程进入无提示等待状态,直到指定的...

    VC线程创建,挂起,执行编程

    挂起线程可以防止其占用系统资源,或者等待某个条件满足后再继续执行。然而,需要注意的是,不正确的挂起操作可能导致死锁或其他难以预料的问题,因此在实际应用中需谨慎使用。 恢复线程的执行则使用`ResumeThread`...

    MFC多线程 多事件

    在MFC中,可以设置线程的退出标志或者发送一个消息给线程,让它们在检测到标志或接收到消息后自行终止。使用`AfxPostThreadMessage()`可以向线程发送消息,而线程在`PumpMessage()`循环中检查并处理这些消息,当接收...

    资源池等待所有线程执行完毕的方法

    ### 资源池等待所有线程执行完毕的方法 在多线程编程中,经常会遇到需要等待所有线程执行完毕的情况。例如,在一个基于线程池的应用程序中,可能需要确保所有的任务都已完成才能继续执行后续操作或者进行清理工作。...

    前端请求,多线程执行

    在IT行业中,前端请求与多线程执行是两个重要的概念,尤其在构建高效、响应迅速的Web应用时显得至关重要。本文将围绕这两个主题展开,详细解释它们的含义、作用以及如何在实际开发中运用。 首先,让我们理解"前端...

    乐玩8.172游戏自动登录多线程执行任务易语言源码逍遥Q缘

    在游戏自动化中,多线程能够提高执行效率,例如同时进行师门任务和宝图任务,这样可以在同一时间内完成更多的游戏内容。在易语言中,可以使用“创建线程”命令来创建新的执行线程,并通过同步机制如信号量、事件对象...

    JavaScript单线程还是多线程

    当网络请求完成后,其回调会被放入宏任务队列,等到当前宏任务执行完毕后才会被执行。 在实际开发中,理解JavaScript的单线程模型和事件循环机制非常重要,它可以帮助我们编写更加高效、响应式的代码。例如,通过...

    idea调试多线程.zip

    当我们需要在多线程环境中进行调试时,"3线程1和2都会断点.png"展示了可能出现的情况:在某一行设置断点后,所有通过该行的线程都会触发断点。这可能导致混乱,因为你可能只想暂停特定线程的执行。 IntelliJ IDEA...

    c++与Qt实现把定时器放进子线程中运行

    它展示了如何创建一个子线程,将QTimer移动到子线程,并确保定时器触发的槽函数也在同一子线程内执行。这有助于保持主线程的轻量级,提高应用程序的响应性。 需要注意的是,跨线程通信在Qt中是通过信号和槽机制来...

Global site tag (gtag.js) - Google Analytics