while (!flag){ synchronized (lock){ System.out.println(Thread.currentThread().getName()+"获得锁开始执行"); try { System.out.println(Thread.currentThread().getName()+"执行完毕,释放锁"); lock.wait(); lock.notify(); } catch (InterruptedException e) { throw new RuntimeException(e); } } } }在这个基础上让两个线程相互唤醒
时间: 2023-06-08 22:03:53 浏览: 45
这是一个关于 Java 线程的问题,属于技术问题,可以回答。这段代码可以实现两个线程之间的交互执行。其中,一方(flag)通过 lock.wait() 方法释放锁,进入等待状态,等待另一方通过 lock.notify() 方法唤醒自己的执行。同时,通过使用 synchronized 关键字保证了线程安全。
相关问题
public static void main(String[] args) { Foo foo = new Foo(); // Thread t1 = new Thread(()->foo.methodA()); Thread t1 = new Thread(foo::methodA); Thread t2 = new Thread(foo::methodB); t1.start(); t2.start(); } } class Foo{ public synchronized void methodA(){ Thread t = Thread.currentThread(); System.out.println(t.getName()+":正在执行A方法..."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(t.getName()+":执行A方法完毕"); } public void methodB(){ synchronized(this) { Thread t = Thread.currentThread(); System.out.println(t.getName() + ":正在执行B方法..."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(t.getName() + ":执行B方法完毕"); } }
这段代码展示了Java中的synchronized关键字的使用。synchronized关键字可以用来保证多个线程在访问共享资源时的线程安全性,通过对类或对象加锁来实现。
在这个例子中,Foo类的methodA()方法和methodB()方法都是synchronized方法,它们都使用了this对象作为锁。当一个线程执行methodA()方法时,它会获取this对象的锁,其他线程就无法同时执行methodA()方法或methodB()方法,直到该线程释放锁。因此,在本例中,t1和t2线程不能同时执行methodA()方法或methodB()方法,它们必须交替执行。
需要注意的是,在methodB()方法中,使用了synchronized(this)语句块,这与直接将methodB()方法声明为synchronized方法的效果是一样的,但是它的范围更小,只对synchronized(this)中的代码块加锁。这种方式可以避免对整个方法进行加锁,提高了程序的效率。
class Communication implements Runnable{ int i = 1; public void run() { while (true) { synchronized (this) { notify(); if (i <= 100) { System.out.println(Thread.currentThread().getName() + ":" + i++); } else break; try { wait();} catch (InterruptedException e) { }}}}}
这段代码是一个Java多线程的示例,其中定义了一个实现了Runnable接口的Communication类,它包含一个整型变量i和一个无限循环的while语句。在while循环中,使用了synchronized关键字来保证同步,notify()方法和wait()方法来实现线程的通信。在每次循环中,线程会先调用notify()方法来唤醒其他线程,然后判断i的值是否小于等于100,如果是,则输出当前线程的名称和i的值,然后i自增1。最后,线程调用wait()方法进入等待状态,直到其他线程调用notify()方法唤醒它。当i的值大于100时,线程跳出循环,执行完毕。