那么要怎么终止一个线程呢?

虽然Thread.stop( )方法可以结束一个线程,但是eclipse已经将这个方法标注成一个“废弃”的方法,也就是不推荐使用,原因大家都知道,就是stop( )方法直接终止线程并释放掉锁,容易造成一些对数据进行修改的线程出问题,例如导致多个线程读到不一致的数据的情况。看看下面这个例子:

代码要做的事情就是新建一个写线程和一个读线程,写线程修改变量的值,读线程把值显示出来。写线程在31行开始,获得一个随机数v并赋值给类私有对象id和name,写线程先给变量id赋值v,然后休眠100毫秒,再给变量name赋值。而读线程(第52行开始)则是一直读变量id和name,如果发现两者的值不一致后,就输出两者的值。主线程(第64行开始),新建一个读线程并执行,然后while(true)死循环不停用写线程对数据变量id和name做修改,然后用stop( )方法结束写线程,看看情况会怎么样?

读线程频繁读出两个数据不同步的情况,也就是说,写线程多次还没执行完就被结束了,而且导致数据不同步的问题,我们的写线程希望做的是把变量id和name都赋值相同的值,可是事实并没有做到。

      既然eclipse将stop( )方法标志为“废弃的”,那就是不鼓励我们使用,如果我们要结束一个线程,可以用添加标记的方式,以前写c时常用的判断标记来跳出循环- -、。

在线程重构函数run( )里设置一个标记“stop”,一开始初始化为false,然后定义一个方法stopThread( )用来设置标记位为true,当我们需要结束线程时,就调用stopThread( )方法,标志位设置为true后,代码第42行检测到标志位改变后,就会break结束while循环,用这种方式结束线程,就可以保证修改数据部分不会出错。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值