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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周朋飞 中级黑马   /  2012-7-2 19:50  /  1417 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class ThreadInterrupt
{
        public static void main(String[] args)
        {
                StopThread s = new StopThread();
                Thread t1 = new Thread(s);
                Thread t2 = new Thread(s);
                t1.start();
                t2.start();
                int num=0;
                while(true)
                        {
                         if(num++==5)
                         
                         {
                                 s.change();
                                 break;
                         }
                                 System.out.println(Thread.currentThread().getName()+"......"+num);
                }
                System.out.println("over");
               
        }
}
class StopThread implements Runnable
{
        public boolean flag=true;
        public void change()
        {
                flag=false;
        }
        public synchronized void run()
               
        {
                while(flag)
                {
                       
                       
                        System.out.println(Thread.currentThread().getName()+"......");
                }
        }

}
我的疑问是毕老师后来在线程当中加了一个同步锁,而导致程序线程终结不了,我想问:加同步锁得有两个条件
必须是两个或多个线程同时操作同一份资源那这个程序里不是有三个线程,操作的是哪个资源,不能用notify去唤醒线程吗  必须要用interrupt方法吗

2 个回复

倒序浏览
同步的条件之一是多个线程必须使用同一个锁,这里的锁就是对象s,notify是用来唤醒等待的线程,interrupt是中断的。因为线程的运行代码是循环结构,只要控制住循环就可以让run方法结束,线程就结束 了。这里就是改变了标记,控制了循环,线束了线程t1t2。但是主线程没有标记,所以要通过break来结束循环。
回复 使用道具 举报
这个程序里有三个线程,除了t1,t2之外,还有一个主线程,notify()是用来唤醒wait()等待的,你这里又没有wait()唤醒什么,在说这里也不是等待状态啊,他是被锁到里边了,
但是他还是醒着的啊,就比如你一进厕所,你就把门锁了,但是你还醒着呢,并没有晕倒啊,如果你用了wait(),那么你就需要外边的人敲门来唤醒了你,然后你才会从所里边出来
,而他们操作的是同一资源,在这里就是类变量了,有时候也可以是对象,比如你对同一个学生类的操作啊什么的,这里你可以试试单例,interrupt()打断,你可以把它直接放到主函数的末尾来用它,他是在主线程结束之后发现有别的线程还在运行的时候会调用的方法,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马