class scrollThread extends Thread
{
JScrollBar scroll;
int space=10;
boolean autoGunpingIsSelected=true;
public scrollThread(JScrollBar scroll)
{
this.scroll=scroll;
}

public void run()
{
try
{
while(autoGunpingIsSelected==true)
{
        scroll.setValue(scroll.getValue()+space);
                 Thread.sleep(500);
}
}
catch(Exception ex)
{}
}

public void stopThread()
{
autoGunpingIsSelected=false;
}
}
.....
scrollThread st=new scrollThread();
st.start();我用一个线程来控制滚动条自动滚动,但是我发现当我想终止这个线程的时候,用st.stopThread(),怎么线程终止不了啊。难道是While循环阻塞,更改变量的值没有响应。 怎么修改啊?

解决方案 »

  1.   

    while(autoGunpingIsSelected==true)你条件这么写,它永远是true,怎么终止?改为:while(autoGunnpingIsSelected)
      

  2.   

    这样改也不行啊。你说我的条件永远是true,怎么会?  我调用了st.stopThread(),这时autoGunpingIsSelected==false,循环条件不满足,应该退出循环,线程也就应该终止了才对啊。
    而且我测试的时候,调用了st.stopThread()后,autoGunpingIsSelected的值的确变为了false,那它为什么不跳出循环?
      

  3.   

    在循环里打印一下autoGunpingIsSelected另外,stop的时候,调用一下interrupt方法
      

  4.   

    楼上真搞笑,呵呵。我不知道,你的程序时用来做什么的,但是你那么写就是不对,你参考一下吧。package org.zwj.test;import javax.swing.JScrollBar;class ScrollThread extends Thread
    {
    JScrollBar scroll;
    int space = 10;
    boolean autoGunpingIsSelected = true; public ScrollThread(JScrollBar scroll)
    {
    this.scroll = scroll;
    } public void run()
    {
    try
    {
    //while (autoGunpingIsSelected == true),不能这么写
    while(autoGunpingIsSelected)
    {
    System.out.println("111111111111111");
    }
    } catch (Exception e)
    {
    e.printStackTrace();
    }
    } public void stopThread()
    {
    autoGunpingIsSelected = false;
    } public static void main(String args[]) throws InterruptedException
    {
    ScrollThread st = new ScrollThread(
    new JScrollBar(JScrollBar.HORIZONTAL));
    st.start();

    //5秒后线程终止
    Thread.sleep(5000);
    st.stopThread();
    }
    }
      

  5.   

    autoGunpingIsSelected 申明为volatile , 
    否则多线程环境下,线程可能访问各自的变量拷贝,而不是变量即时值
    volatile boolean autoGunpingIsSelected=true;
    不需要interrupt也应该可以停。
      

  6.   

    是这样的,我在做一款阅读软件,软件具有自动滚屏功能。 
    我定义了一个JToggleButton zidonggunping=new JToggleButton("自动滚屏")类型的按钮,我是这样想的,当按钮处于点击状态时开始自动滚屏,否则停止自动滚屏。定义全局变量 scrollThread st;zidonggunping.addActionListener(new ActionListener()
        {
    public void actionPerformed(ActionEvent e) 
    {


     st=new scrollThread(scroll.getVerticalScrollBar());
    if(zidonggunping.isSelected())
    {
    zidonggunping.setToolTipText("当前为自动滚屏阅读");

    try
    {
    st.start();
    }
    catch(Exception ex)
    {

    }
    }
    else
    {
    zidonggunping.setToolTipText("自动滚屏阅读");

        st.stopThread();

    }

    }
        
        });结果不行。令人疑惑的是 当我把终止线程函数放在 JButton stopThread=new JButton("终止线程"); 类型变量的函数时,线程可以被终止。stopThread.addActionListener(new ActionListener()
        {
    public void actionPerformed(ActionEvent e) 
    {
    st.stopThread();

    }
        
        });这是为什么啊,该怎么改啊?。
      

  7.   

    我找到问题的原因了:问题在这,当JToggleButton类型的按钮zidonggunping处于点击状态时,进入 actionPerformed函数
    st=new scrollThread(scroll.getVerticalScrollBar()); //开辟第一个线程
    st.start()
    线程开始运行。
    但是当我再次点击它时,又进入 actionPerformed函数,
    st=new scrollThread(scroll.getVerticalScrollBar());//开辟第二个线程所以当点击这样一个类型的按钮时,他实际上有 两个 完全独立的线程,所以此时执行st.stopThread()是线程2的函数,线程2被销毁(实际上是它刚被创建即被销毁)但是线程1仍然在运行,并没有被终止。它访问的是2个不同的变量。所以当我把st=new scrollThread(scroll.getVerticalScrollBar())这句从actionPerformed函数中移到构造函数时,结果就运行正确了,因为此时它访问的同一个变量。
      

  8.   

    敢问while(autoGunpingIsSelected==true)和while(autoGunnpingIsSelected)有区别?