线程同步如何与Sleep()一起工作?

时间:2014-01-19 03:43:14

标签: java multithreading

class ABC extends Thread

{

    public void run()
    {
        display();
    }

    public synchronized void display()
    {
        {
            System.out.println("1");            
            try
            {
                this.sleep(1000);

            }catch(Exception e)
            {

            }
            System.out.println("2");
        }
    }
}

public class Thread_10 

{

    public static void main(String[] args)  
    {
        ABC t1=new ABC();
        t1.start();
        ABC t2=new ABC();
        t2.start();
    }
}

输出: - 1 1 2 2

我想了解同步的概念。如您所见,我在display()中有一个sleep()。现在,当线程“t1”执行run()并在打印“1”后进入休眠状态时,为什么线程“t2”通过run()进入display()?因为,我的函数display()被声明为synchronized,所以它已被线程“t1”锁定。 我期待以下输出: -

1 2 1 2

2 个答案:

答案 0 :(得分:0)

函数名之前的同步关键字修饰符基本上创建了一个可在多线程环境下工作的线程安全块或函数。

  

java synchronized隐含在java对象上,它保持锁定直到当前线程完成任务。

对于你的情况,你犯了一些错误,你已经创建了两个不同的ABC类对象并启动了两个不同的线程,所以这里同步函数没有任何事情要做。它的行为就像普通函数一样。我修改了你的书面课程,它现在可以同步了。

ABC.java
--------       
class ABC
{
public synchronized void display()
    {
        {
            System.out.println("1");            
            try
            {
                Thread.sleep(1000);

            }catch(Exception e)
            {

            }
            System.out.println("2");
        }
    }
}

ExampleThread.java
------------------
public class ExampleThread extends Thread
{
  ABC abc;
  public ExampleThread(ABC a)
  {
   this.abc=a;
  }

  public void run()
  {
     while(true)
     {
      this.abc.display();
     }
  }
}

Test.java
---------
public class Test 
{

    public static void main(String[] args)  
    {
        ABC shared_object=new ABC();
        ExampleThread t1=new ExampleThread (shared_object);
        t1.start();

        ExampleThread t2=new ExampleThread(shared_object);
        t2.start();
    }
}

有关java http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

中同步的更多详细信息

答案 1 :(得分:0)

您正在同步不同的对象,您需要一个共同的对象。在主类同步中创建一个Object lock字段:sychronized(lock) {...}

相关问题