假设一个线程打印“hello”,另一个线程打印“world”。我曾经成功地做过一次,如下:包线程;
public class InterThread {
public static void main(String[] args) {
MyThread mt=new MyThread();
mt.start();
synchronized(mt){
System.out.println("Hello");
try {
mt.wait();
i++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class MyThread extends Thread{
public void run(){
synchronized(this){
System.out.println("World!");
notify();
}
}
}
我怎么做多次打印,比如说5次?我试着在同步块上循环,但是没有用。
7条答案
按热度按时间5lwkijsr1#
有两个线程,它们都有自己的数据(“hello”和true对ht,“world”和false对wt),并共享一个变量objturn。
yb3bgrhw2#
这是c:
jqjz2hbq3#
这里的目标是同步线程,以便在一个线程完成时通知另一个线程。如果我必须这样做,它将是两个线程用不同的数据执行相同的代码。每个线程都有自己的数据(
"Hello"
以及true
到t1,"World"
以及false
到t2),并共享一个变量turn
加上一个单独的锁对象。jaql4c8m4#
这里是两个相互依赖的线程,我们需要两个同步对象。它们可能是很多东西中的一个。一个整数,另一个对象;一个布尔值另一个对象;两个目标;信号量等等。同步技术可以是监视器或信号量,但它们必须是两个。
我修改了你的代码,用信号量代替监视器。信号量的工作更加透明。您可以看到获取和释放正在发生。监视器是更高的结构。因此在引擎盖下同步工作。
如果您对以下代码感到满意,那么可以将其转换为使用监视器。
mitkmikd5#
在你开始尝试让它工作五次之前,你需要确保它工作一次!
你的代码不能保证总是打印hello world!-在锁定mt之前,主线程可能会被中断(请注意,锁定线程对象通常不是一个好主意)。
一种方法是使用原子布尔值,这种方法可以推广很多次
ssm49v7z6#
wko9yo5t7#
简单地说,我们可以使用
wait()
以及notify()
不创建任何额外的对象。