java - 子线程同步在这里不起作用

标签 java

Java 代码:

// Create a second thread.
class NewThread implements Runnable 
{
    Thread t;
    NewThread() 
    {   
        t = new Thread(this, "Demo Thread");    // Create a new, second thread
        System.out.println("Child thread: " + t);
        t.start();              // Start the thread
    }
    public void run()   // This is the entry point for the second thread.
    {
        justCall();
    }
    public synchronized void justCall()
    {
        try 
        {   
                for(int i = 10; i > 0; i--)
                {
                    System.out.println("Child Thread: " + i);
                    Thread.sleep(10000);
                }

        }
        catch (Exception e) 
        {
            System.out.println("Child interrupted.");
        }
        System.out.println("Exiting child thread.");
    }
}
class ThreadDemo 
{
    public static void main(String args[]) 
    {
        NewThread nt = new NewThread();         // create a new thread
        try 
        {
            for(int i = 5; i > 0; i--) 
            {
                System.out.println("Main Thread: " + i);
                Thread.sleep(1000);
            }
        }
        catch (InterruptedException e) 
        {
            System.out.println("Main thread interrupted.");
        }   
        System.out.println("Main thread exiting.");
    }
}

这里可以删除同步的 justCall() 方法,并且可以在 run() 方法中初始化同步块(synchronized block)(将 justCall() 方法的代码放在同步块(synchronized block)中)。

这里如何同步子代码?请帮忙。我读到 Thread.sleep() 方法在同步块(synchronized block)或方法中执行时永远不会释放锁。但在我的代码中,主线程和子代码同时执行。请帮助使用 Thread.sleep() 方法同步子代码。

最佳答案

当两个线程在同一个对象上同步时,它们不会都运行相同的代码。这允许许多不同的线程同时在许多不同的代码区域中协作运行。

非静态方法上的同步会在this对象上创建一个锁。如果它是静态方法,则锁将位于 NewThread 类的 Class 对象上。任何类和任何类的任何实例都可以有一个同步,从而创建一个锁。

您只有一个线程在同步区域中运行。因此,当它被锁定时,没有其他线程尝试运行锁定的代码。没有其他线程尝试在 NewThread 类的 nt 实例上进行同步。

您可能想尝试这样做:

NewThread nt1 = new NewThread();         // create a new thread
NewThread nt2 = new NewThread();         // create a 2nd new thread

然后停止主类中的循环。

关于java - 子线程同步在这里不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15767720/

相关文章:

java - JSF Richfaces 部分标签的渲染条件

java - liferay 服务构建器中的异常“:"java. lang.ClassCastException

java - 静态变量: How to reclaim memory?

java - 什么加载了 Java 系统类加载器?

java - java反编译器如何知道变量或对象名称?

java - 使用 Google App Engine 的网络服务

java - 在 Java 中使用 Quartz 运行两个作业

java - 获取手机信号塔位置 - Android

java - 为什么我的 JScrollpane 没有更新删除更改,尽管有 validate() 和 repaint()

java - 为什么 JEditorPane 不显示用 HTML 编写的图像?