gpt4 book ai didi

java - 如何在静态同步块(synchronized block)内进行线程间通信

转载 作者:行者123 更新时间:2023-12-01 17:57:19 24 4
gpt4 key购买 nike

我有一个关于静态同步方法和类级锁定的问题。有人可以帮我解释这个例子吗:

class Test
{
synchronized static void printTest(int n)
{
for (int i = 1; i <= 10; i++) {
System.out.println(n * i);
try {
Thread.sleep(400);
} catch (Exception ignored) {}
}
}
}

class MyThread1 extends Thread
{
public void run()
{
Test.printTest(1);
}
}

class MyThread2 extends Thread
{
public void run()
{
Test.printTest(10);
}
}

public class TestSynchronization
{
public static void main(String[] args)
{
MyThread1 t1 = new MyThread1();
MyThread2 t2 = new MyThread2();
t1.start();
t2.start();
}
}

问题:

当线程 t1位于循环中间(在 printTest() 内),我想让它停止执行并将控制权转移到线程 t2 。有什么办法可以做到吗?

由于我们处理类级别锁,我相信我们不能使用对象级别 wait()notify()这里的方法将释放对象级锁。但是如果是类级锁,如何释放它并将控制权交给其他等待线程?

我们如何通知正在执行过程中等待线程 1 持有的类级锁的第二个线程?

最佳答案

可以在此处使用

interrupt() 来满足您的要求。

如果您的需求将来发生变化,并且需要在第二个线程之后执行第一个线程,则删除 printTest 内的 if(Thread.interrupted())

 class Test {
synchronized static void printTest(int n) {
for (int i = 1; i <= 10; i++) {
if(Thread.interrupted())
break;
System.out.println(n * i);
try {
Thread.sleep(400);
} catch (Exception e) {
}
}
}
}

class MyThread1 extends Thread {
public void run() {
Test.printTest(1);
}
}

class MyThread2 extends Thread {
public void run() {
Test.printTest(10);
}
}

public class TestSynchronization {
public static void main(String t[]) throws InterruptedException {
MyThread1 t1 = new MyThread1();
MyThread2 t2 = new MyThread2();
t1.start();
t2.start();

t1.interrupt();
t1.join();
}

}

关于java - 如何在静态同步块(synchronized block)内进行线程间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43662311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com