【线程问题】关于如何退出正在进行的线程

LL_smallcode 2019-04-07 05:56:49
public class TsetThread implement Runnable{
public void run(){
while(isStop){
fun1();
fun2();
fun3();
}
}
}

boolean isStop = true;
new Thread(new TestThread()).start();

fun1{
if(Exception){
isStop = false;
...
}else{
.......
}
}

fun2{
if(Exception){
isStop = false;
...
}else{
.......
}
}

fun3{
if(Exception){
isStop = false;
...
}else{
.......
}
}


//这是程序的基本结构(简单了点还请见谅),要求在哪
一步发生异常,
//则线程终止,但现在的问题是只要进入线程了,
//就会一直进行下去,不会判定isStop,请教各位大神
//如何终止线程,拜谢。



...全文
471 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_40670111 2019-04-11
  • 打赏
  • 举报
回复
异常也是要捕获的啊,我看不出来哪里是在捕获异常
Longerlive 2019-04-10
  • 打赏
  • 举报
回复
引用 8 楼 LL_smallcode 的回复:
[quote=引用 6 楼 Longerlive 的回复:] 循环结构用的不对,或者说想法是好的但是跟程序逻辑不对 首先,以isStop为true进入while循环,然后执行三个fun()方法,里面有让isStop为false的判断。 其次,if()语句执行了,isStop也是false了,但是线程依旧没有结束。很简单,因为这时在while循环里面,即便isStop是false,也不会去判断while(isStop),直到循环结束,才会去判定isStop。 最后,建议换一种方法,个人任务循环语句是达不到你的需求的
明白了,谢谢大神道出了真相。顺便可以给个解决的思路吗,比如用什么语言结构好一点[/quote] 可以这样,把fun()方法改为带返回值的,返回boolean类型;然后在while循环中的fun()方法后面加一个if()判断,满足条件就break退出;不满足就继续往下执行fun2()等
Dan淡淡的心 2019-04-10
  • 打赏
  • 举报
回复
我还以为你说你死循环了 然后出不去线程呢.........
yo嚛嚛yo 2019-04-10
  • 打赏
  • 举报
回复
建议你去了解下内存可见性,你改变 isStop 的值是在主线程,在你自己 new 的新线程里面并不会获取到新的 isStop 的值,所以就会一直循环,可以使用 volatile 或 synchronized 关键字来解决这个问题
LL_smallcode 2019-04-10
  • 打赏
  • 举报
回复
引用 6 楼 Longerlive 的回复:
循环结构用的不对,或者说想法是好的但是跟程序逻辑不对 首先,以isStop为true进入while循环,然后执行三个fun()方法,里面有让isStop为false的判断。 其次,if()语句执行了,isStop也是false了,但是线程依旧没有结束。很简单,因为这时在while循环里面,即便isStop是false,也不会去判断while(isStop),直到循环结束,才会去判定isStop。 最后,建议换一种方法,个人任务循环语句是达不到你的需求的
明白了,谢谢大神道出了真相。顺便可以给个解决的思路吗,比如用什么语言结构好一点
LL_smallcode 2019-04-10
  • 打赏
  • 举报
回复
测试过 如果可以进入 并且修改isStop的值 是可以退出的 这个问题 不是线程问题了 虽说你是写在线程里 的 但是 整个问题代码是一个单线程的 跟其他线程不影响[/quote]
public class TestThread {
	
	static boolean isStop ;
	int a = 10;
	int b,c,d = 0;

	public static void main(String[] args) {
		
	}
	
	public class ThreadTest implements Runnable{

		@Override
		public void run() {
			while(isStop){
				fun1();
				fun2();
				fun3();
			}
			
		}

		private void fun3() {
			if(d > a){
				isStop = false;
				System.out.println("stop d");
			}else{
				d+=1;				
			} 			
		}

		private void fun2() {
			if(c > a){
				isStop = false;
				System.out.println("stop c");
			}else{	
				c+=1;
			}			
		}

		private void fun1() {
			if(b > a){
				isStop = false;
				System.out.println("stop b");
			}else{
				b+=1;
			}			
		}
		
	}

}
兄弟,这是我的程序设计,我想到b的时候停止了
Longerlive 2019-04-10
  • 打赏
  • 举报
回复
循环结构用的不对,或者说想法是好的但是跟程序逻辑不对 首先,以isStop为true进入while循环,然后执行三个fun()方法,里面有让isStop为false的判断。 其次,if()语句执行了,isStop也是false了,但是线程依旧没有结束。很简单,因为这时在while循环里面,即便isStop是false,也不会去判断while(isStop),直到循环结束,才会去判定isStop。 最后,建议换一种方法,个人任务循环语句是达不到你的需求的
Dan淡淡的心 2019-04-10
  • 打赏
  • 举报
回复
引用 3 楼 LL_smallcode 的回复:
[quote=引用 1 楼 Dan淡淡的心 的回复:] 你先判断一下 if(){这里的程序有没有被执行吧 }
我能确定,if(){ 这里的程序执行了}[/quote] 测试过 如果可以进入 并且修改isStop的值 是可以退出的 这个问题 不是线程问题了 虽说你是写在线程里 的 但是 整个问题代码是一个单线程的 跟其他线程不影响
LL_smallcode 2019-04-10
  • 打赏
  • 举报
回复
你设置 if(Exception)这里判断语句有问题所以不会执行if块里的语句所以一直isStop是true,你自己debug一下Exception的值看看 。[/quote] 已经debug了,Exception的值已经为true,if里面的语句执行了,isStop也为false了,但线程还是没停
LL_smallcode 2019-04-10
  • 打赏
  • 举报
回复
引用 1 楼 Dan淡淡的心 的回复:
你先判断一下 if(){这里的程序有没有被执行吧 }
我能确定,if(){ 这里的程序执行了}
LL_smallcode 2019-04-10
  • 打赏
  • 举报
回复
引用 12 楼 Dan淡淡的心 的回复:
兄弟,你也是打印出stop b/c/d的啊。我的想法是打印stop b,然后就end了。
LL_smallcode 2019-04-10
  • 打赏
  • 举报
回复
引用 10 楼 Longerlive 的回复:
[quote=引用 8 楼 LL_smallcode 的回复:] [quote=引用 6 楼 Longerlive 的回复:] 循环结构用的不对,或者说想法是好的但是跟程序逻辑不对 首先,以isStop为true进入while循环,然后执行三个fun()方法,里面有让isStop为false的判断。 其次,if()语句执行了,isStop也是false了,但是线程依旧没有结束。很简单,因为这时在while循环里面,即便isStop是false,也不会去判断while(isStop),直到循环结束,才会去判定isStop。 最后,建议换一种方法,个人任务循环语句是达不到你的需求的
明白了,谢谢大神道出了真相。顺便可以给个解决的思路吗,比如用什么语言结构好一点[/quote] 可以这样,把fun()方法改为带返回值的,返回boolean类型;然后在while循环中的fun()方法后面加一个if()判断,满足条件就break退出;不满足就继续往下执行fun2()等[/quote] 加个好友啊兄弟
LL_smallcode 2019-04-10
  • 打赏
  • 举报
回复
加个好友可以吗
Dan淡淡的心 2019-04-10
  • 打赏
  • 举报
回复
Dan淡淡的心 2019-04-10
  • 打赏
  • 举报
回复

package Test;
public class TestThread {


	public static void main(String[] args) {
		new Thread(new ThreadTest()).start();
	}
}	
class ThreadTest implements Runnable{
	static boolean isStop ;
	int a = 10;
	int b,c,d = 0;

	@Override
	public void run() {
		while(isStop){
			fun1();
			fun2();
			fun3();
		}
		System.out.println("stop");
	}

	private void fun3() {
		if(d > a){
			isStop = false;
			System.out.println("stop d");
		}else{
			d+=1;				
		} 			
	}

	private void fun2() {
		if(c > a){
			isStop = false;
			System.out.println("stop c");
		}else{	
			c+=1;
		}			
	}

	private void fun1() {
		if(b > a){
			isStop = false;
			System.out.println("stop b");
		}else{
			b+=1;
		}			
	}

}


这样是可以直接退出的 你刚刚给的是内部类

package Test;
public class TestThread {
	
	static boolean isStop ;
	int a = 10;
	int b,c,d = 0;

	public static void main(String[] args) {
		new Thread(new TestThread().new ThreadTest()).start();
	}
	
	class ThreadTest implements Runnable{

		@Override
		public void run() {
			while(isStop){
				fun1();
				fun2();
				fun3();
			}
			System.out.println("end");
		}

		private void fun3() {
			if(d > a){
				isStop = false;
				System.out.println("stop d");
			}else{
				d+=1;				
			} 			
		}

		private void fun2() {
			if(c > a){
				isStop = false;
				System.out.println("stop c");
			}else{	
				c+=1;
			}			
		}

		private void fun1() {
			if(b > a){
				isStop = false;
				System.out.println("stop b");
			}else{
				b+=1;
			}			
		}
		
	}

}
我这边测试 也是直接退出的 打印出 "end"
Dan淡淡的心 2019-04-08
  • 打赏
  • 举报
回复
你先判断一下 if(){这里的程序有没有被执行吧 }
qq_39936465 2019-04-08
  • 打赏
  • 举报
回复
引用 楼主 LL_smallcode 的回复:
public class TsetThread implement Runnable{
public void run(){
while(isStop){
fun1();
fun2();
fun3();
}
}
}

boolean isStop = true;
new Thread(new TestThread()).start();

fun1{
if(Exception){
isStop = false;
...
}else{
.......
}
}

fun2{
if(Exception){
isStop = false;
...
}else{
.......
}
}

fun3{
if(Exception){
isStop = false;
...
}else{
.......
}
}


//这是程序的基本结构(简单了点还请见谅),要求在哪
一步发生异常,
//则线程终止,但现在的问题是只要进入线程了,
//就会一直进行下去,不会判定isStop,请教各位大神
//如何终止线程,拜谢。

你设置 if(Exception)这里判断语句有问题所以不会执行if块里的语句所以一直isStop是true,你自己debug一下Exception的值看看 。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧