站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题好怪,我把一个线程interrupt了,但它还在运行的?为何会这样

好怪,我把一个线程interrupt了,但它还在运行的?为何会这样

摘要: 好怪,我把一个线程interrupt了,但它还在运行的?为何会这样


Thread t=new Thread(this);
t.start();
之后我用按钮把他interrupt
t.interrupt();
但发觉他还是在运行。
不可能吧
那怎么中断一人线程了


t.interrupt(); 这条语句之前线程是不是已经完整的执行完毕了呢???



楼主发现线程还在运行证明不是线程结束造成的,对线程的interrupt是对线程处在sleep,wait,join状态的时候才起作用。InterruptException不interrupt()方法抛出的,interrupt()只改变线程的中断状态,sleep,wait,join的内部会不停的检查线程中断状态,如果它们检查到线程处于中断状态,就抛出异常中断线程。如果你的线程不处于这3个状态中,调用interrupt不会中断线程,或者说不会马上中断线程,如果后面的代码有让线程进入上面3个状态的其中一个,线程会马上抛出InterruptException而中断,因为你之前的interrupt()调用改变了线程的内部状态。


可以用已经不推荐的stop方法


基本线程:在Java中使用线程,最简单的方法是派生自java.lang.Thread,并且覆写void run()方法,start()方法用于启动该线程,通常在构造函数里面进行初始化后调用该方法。yield()方法告诉JVM,该线程已经结束,但不保证能得到反应。sleep(int millisecond)方法用于休眠若干毫秒。interrupt()方法用于唤醒调用了wait()方法而等待的线程。我们可以通过调用setPriority()方法来设置线程的优先级,线程的优先级总共有10级,但为了保证可移植性,我们最好使用MIN_PRIORITY、NORM_PRIORITY和MAX_PRIORITY。
守护线程:它是指只要程序还在运行,它就应该在后台提供某种公共服务的线程,但它不属于程序的核心部分。例如:main的线程就属于非守护线程。若要创建守护线程,我们在它启动之前,调用setDaemon()方法来设置。
连接线程:一个线程可以调用另一个线程的jon()方法,主叫线程会先挂起,而等到那个线程结束后再继续运行。我们也可以给jon()方法给一个timeout参数,这样如果目标线程在期限到期后还没有结束,join()就会强制返回。而且join()方法还会被主叫线程的interrupt()方法打断。
若我们想要继承自别的类,我们可以使用Runnable接口。Runnable接口只有一个run()方法。当然我们也可以使用匿名类和内部类来使用线程,而不用派生自Thread和Runnable。
共享资源:
semaphore:用于线程间通信的标志对象,我们可以通过使用synchronized关键字作为函数定义的前缀来保护代码。
原子操作:在成员变量前面加上volatile关键字。
关键段:有时只需要防止多个线程同时访问方法中的某一部分,我们可以使用synchronized关键段。如下:
synchronized(syncObject) {
? // This code can be accessed
? // by only one thread at a time
}
线程的状态,有如下四种:
New:已经创建完毕,但还没有开始启动。
Runnable:只要cpu分给其时间,就能运行。
Dead:中止线程的正确的方法是退出run()方法。
Blocked:就本身而言,是可运行的,但因为某种原因而被阻塞。除非重新进入Runnable否则,cpu不会分给其时间。
线程间协同工作:
sleep与wait方法的区别:sleep不会释放对象的锁,而wait则会。除了时间到外,它还可以用notify()或notifyAll()方法来中止。
用管道进行线程间的I/O操作:使用PipedReader和PipedWriter


我还以为直接用interrupt他就会中断了
现在知道了


↑返回目录
前一篇: 哪位兄弟有fileupload组件 commons-fileupload-1.1-dev.jar,commons-io-1.1-dev.jar, 麻烦发一份给我:t97102003@163.com.谢谢!
后一篇: java如何实现将多个媒体文件合并为一个媒体文件?