A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾文泽 高级黑马   /  2013-2-23 14:18  /  1749 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class StopThread implements Runnable{
  2.         private boolean flag = true;
  3.         public synchronized void run(){
  4.                 while(flag){
  5.                         try{
  6.                                 wait();              //t1线程挂这了,这时候t1线程跟main线程都被阻塞了,要用什么方法才能让程序结束
  7.                         }
  8.                         catch (InterruptedException e){
  9.                                
  10.                                 System.out.println(Thread.currentThread().getName()+"...."+e.toString());
  11.                                 flag = false;         //改变标记,结束循环,也就是结束run方法,结束线程
  12.                         }
  13.                         System.out.println(Thread.currentThread().getName()+"......run");
  14.                 }
  15.         }
  16.         public void setFlag(){
  17.                 flag = false;
  18.         }
  19. }
  20. public class StopThreadDemo {
  21.         public static void main(String[] args) {
  22.                 StopThread st = new StopThread();

  23.                 Thread t1 = new Thread(st);
  24.                
  25.                 t1.start();
  26.                  
  27.                 try{
  28.                         t1.join();        //main线程等待t1线程结束后再执行,但是t1线程挂上面了
  29.                 }catch(InterruptedException e){
  30.                         System.out.println(Thread.currentThread().getName()+"...."+e.toString());
  31.                 }
  32.                 //以下的代码执行不到,
  33.                 int num = 1;
  34.                 while(true){
  35.                         if(++num==50){
  36.                                 //清除t1的冻结状态。
  37.                                 t1.interrupt();     //强制让t1线程恢复到运行状态,并抛出中断异常,从而结束run方法,结束线程
  38.                                 break;
  39.                         }
  40.                         System.out.println(Thread.currentThread().getName()+"....."+num);
  41.                 }
  42.                 System.out.println("over");
  43.         }
  44. }
复制代码
上面的代码main线程跟t1线程都在 被阻塞状态,无法调用interrupt()方法,应该怎么结束程序

6 个回复

倒序浏览
那就别用synchronized同步了,使用Lock锁机制就行了,如果你看到了毕老师讲关于Lock这一课,你应该会解决了。
回复 使用道具 举报
黄玉昆 发表于 2013-2-23 14:30
那就别用synchronized同步了,使用Lock锁机制就行了,如果你看到了毕老师讲关于Lock这一课,你应该会解决了 ...

看过了映象不深,知识点这样反复锤炼才可以完全掌握,多谢玉昆兄:lol
回复 使用道具 举报
程序里面有几点很容易造成线程等待,
你只设立了一个除主线程之外的线程,没必要用synchronized同步.缺乏同步的前提:
1:必须有两个以上的线程
2:几个线程操作共享资源
join()方法可以由yield()应该要好一些.因为只使线程释放一下控制权.感觉你这程序完全是为了让程序躺下而写了....
回复 使用道具 举报
看了半天,终于看出问题所在了,你想要主线程等t1结束后执行,那你为什么要t1执行wait呢,在等谁呢?主线程等它,它等主线程,死锁!
回复 使用道具 举报
把 t1.join();改成t1.join(1000),1s后,主线程会接着运行,然后就可以结束了。
回复 使用道具 举报
王晓楠 发表于 2013-2-23 15:19
看了半天,终于看出问题所在了,你想要主线程等t1结束后执行,那你为什么要t1执行wait呢,在等谁呢?主线程 ...

也不一定是wait啊,用wait方法只是我们对想法的一种实现而已,也就是说t1线程在真实情况下可能因为别的原因被阻塞,。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马