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循环阻塞,更改变量的值没有响应。 怎么修改啊?
{
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循环阻塞,更改变量的值没有响应。 怎么修改啊?
解决方案 »
- html div小问题 求解
- java邮件开发出现java.lang.ClassCastException: javax.mail.Session cannot be cast to j错误
- awt重量级组件的peer对象是什么时候创建的?
- 对局域网内其他电脑的数据库写记录过慢是什么原因造成的?
- 在北京找个工作
- 求教:利用org.apache.tools.zip.ZipFile在UNIX下解压1M的ZIP文件为何无法解压?
- 关于JAVA反射的问题
- 一个很菜的问题,请大家帮忙,谢谢
- 各位大侠,请问JFrame上的标题栏问题??????????
- 谢谢!请问如何建立JAVA小程序运行环境??
- 接口问题
- 准备开发一个远程控制软件,自己玩玩,请给一点思路。
而且我测试的时候,调用了st.stopThread()后,autoGunpingIsSelected的值的确变为了false,那它为什么不跳出循环?
{
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();
}
}
否则多线程环境下,线程可能访问各自的变量拷贝,而不是变量即时值
volatile boolean autoGunpingIsSelected=true;
不需要interrupt也应该可以停。
我定义了一个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();
}
});这是为什么啊,该怎么改啊?。
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函数中移到构造函数时,结果就运行正确了,因为此时它访问的同一个变量。