4

我是一名 java 程序员,我对线程有概念上的疑问。我只想知道一个线程在两种情况下会进入哪个状态。

  1. 当你加入一个线程时,加入的线程会进入什么状态?
  2. 当一个等待线程被通知时,它将进入哪个状态。可运行还是正在运行?

谢谢

  1. 第一个问题的详细信息

在一个程序主线程正在运行中,它创建了 3 个名为“A”、“B”和“C”的新线程。然后所有 3 个线程“A”、“B”和“C”线程加入“主”线程。现在主线程处于哪个状态。

  1. 第二题详情

这是等待和通知的示例代码。如果假设 2 个线程“A”和“B”开始使用“hello”对象。第一个 B 线程执行并进入“等待”状态。然后“A”线程执行并通知“B”线程。现在“等待”线程 B 将进入哪个状态。会因为对象锁被释放而直接进入Running状态还是先进入Runnable再进入Running状态?注意还有一个主线程也存在

public class Hello {
     int x;
     boolean flag=false;
     synchronized public void push(int x)
     {
         if(flag)
         {
             try
             {
                 wait();
             }
             catch(Exception e)
             {
                 System.out.println(e);
             }
         }
         this.x=x;
         System.out.println(x +"is pushed");
         flag=true;
         notify();
     }

    synchronized public void pop()
     {
        if(!flag)
         {
            try
             {
                wait();
             }
             catch(Exception e)
             {
                 System.out.println(e);
             }
         }
         System.out.println(x +"is poped");
         flag=false;
         notify();

     }

}

class A implements Runnable
{
     Hello h=null;
     A(Hello h,String name)
     {
         this.h=h;
         Thread t1=new Thread(this,name);
         t1.start();
     }
     public void run()
     {
         int a=1;
         for(int i=0;i<7;i++)
         {
             h.push(a++);
         }
     }
}

class B implements Runnable
{
     Hello h=null;
     B(Hello h,String name)
     {
         this.h=h;
         Thread t2=new Thread(this,name);
         t2.start();
     }
     public void run()
     {
        for(int i=0;i<7;i++)
         {
            h.pop();
         }
     }
};

public class WaitAndNotifyDemo {
    public static void main(String[] args) {
        Hello h = new Hello();
         A obj1=new A(h,"A");
         B obj2=new B(h,"B");


    }

}
4

1 回答 1

3
  1. 加入的线程甚至不会注意到您正在加入它。加入线程将进入等待状态。
  2. 被通知的线程最初将进入阻塞状态,因为它将被添加到它之前执行过的监视器的等待集中Object#wait。根据定义Object#wait,只能针对您当前拥有锁的对象执行,并且您必须重新获取该锁才能从wait.

请注意, RunnableRunning之间的区别在于线程调度程序的一个细节。Thread.State枚举不区分这些。

于 2013-11-07T09:32:27.820 回答