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/