黑马程序员技术交流社区

标题: 多线程中断的问题 [打印本页]

作者: 周朋飞    时间: 2012-7-2 19:50
标题: 多线程中断的问题
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方法吗
作者: 孙飞    时间: 2012-7-2 23:04
同步的条件之一是多个线程必须使用同一个锁,这里的锁就是对象s,notify是用来唤醒等待的线程,interrupt是中断的。因为线程的运行代码是循环结构,只要控制住循环就可以让run方法结束,线程就结束 了。这里就是改变了标记,控制了循环,线束了线程t1t2。但是主线程没有标记,所以要通过break来结束循环。
作者: 贾飞雨    时间: 2012-7-3 01:46
这个程序里有三个线程,除了t1,t2之外,还有一个主线程,notify()是用来唤醒wait()等待的,你这里又没有wait()唤醒什么,在说这里也不是等待状态啊,他是被锁到里边了,
但是他还是醒着的啊,就比如你一进厕所,你就把门锁了,但是你还醒着呢,并没有晕倒啊,如果你用了wait(),那么你就需要外边的人敲门来唤醒了你,然后你才会从所里边出来
,而他们操作的是同一资源,在这里就是类变量了,有时候也可以是对象,比如你对同一个学生类的操作啊什么的,这里你可以试试单例,interrupt()打断,你可以把它直接放到主函数的末尾来用它,他是在主线程结束之后发现有别的线程还在运行的时候会调用的方法,





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2