Java:如何让2个线程交替使用一个方法

对 Threads 有点陌生。


我有 2 个线程并希望它们交替使用一种方法。所以线程 1 执行该方法,然后等待。然后线程 2 唤醒线程 1 并执行该方法。然后线程 1 唤醒线程 2 并执行该方法等。但不知何故我陷入了僵局,我不明白为什么。


public class NewT extends Thread{



public void print(NewT x)

{


    synchronized(this)

    {


        System.out.println("x"+x);

        notifyAll();

        try {

            wait();

        } catch (InterruptedException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }



}


public void run()

{


    for(int i=0;i<10;i++)

    {

        print(this);                

    }



}


public static void main(String[] args) {

    // TODO Auto-generated method stub


    NewT one = new NewT();

    NewT two = new NewT();



    one.start();

    two.start();





}


}


绝地无双
浏览 151回答 3
3回答

九州编程

由于synchronized是对this每个线程锁定其自己的对象,而实际上没有同步; 他们正在等待一个永远不会到来的事件。更新:正如有人指出的那样,使用公共lock对象是不够的,因为两个线程最终都会等待。这是一个解决方案:private static Object lock = new Object();private static NewT previous;public static void print(NewT x) throws InterruptedException{&nbsp; &nbsp; synchronized(lock) {&nbsp; &nbsp; &nbsp; &nbsp; while (previous == x) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lock.wait();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("x"+ x);&nbsp; &nbsp; &nbsp; &nbsp; previous = x;&nbsp; &nbsp; &nbsp; &nbsp; lock.notifyAll();&nbsp; &nbsp; }}

侃侃尔雅

Wait(),notify()并且notifyAll()在共享公共/共享对象时工作正常。在您的情况下,您正在通知自己(同一线程实例)并等待无限期。结果 JVM 无法在 2 个条目后打印。示例代码:package ThreadsTricks;/**&nbsp;*&nbsp;* @author pcu&nbsp;*/public class PrintOddEven {boolean odd;int count = 1;int MAX = 20;public void printOdd() {&nbsp; &nbsp; synchronized (this) {&nbsp; &nbsp; &nbsp; &nbsp; while (count < MAX) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Checking odd loop");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (!odd) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Odd waiting : " + count);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wait();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Notified odd :" + count);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (InterruptedException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // TODO Auto-generated catch block&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Odd Thread :" + count);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; odd = false;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notify();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}public void printEven() {&nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; //&nbsp; Thread.sleep(1000);&nbsp; &nbsp; } catch (Exception e1) {&nbsp; &nbsp; &nbsp; &nbsp; e1.printStackTrace();&nbsp; &nbsp; }&nbsp; &nbsp; synchronized (this) {&nbsp; &nbsp; &nbsp; &nbsp; while (count < MAX) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Checking even loop");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (odd) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Even waiting: " + count);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wait();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Notified even:" + count);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (InterruptedException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Even thread :" + count);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; odd = true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notify();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}public static void main(String[] args) {&nbsp; &nbsp; PrintOddEven oddEven= new PrintOddEven();&nbsp; &nbsp; oddEven.odd = true;&nbsp; &nbsp; Thread t1 = new Thread(new Runnable() {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; oddEven.printEven();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; });&nbsp; &nbsp; Thread t2 = new Thread(new Runnable() {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; oddEven.printOdd();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; });&nbsp; &nbsp; t1.start();&nbsp; &nbsp; t2.start();&nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; t1.join();&nbsp; &nbsp; &nbsp; &nbsp; t2.join();&nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; }}这是我的第一个回答,如果有任何问题,请告诉我。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java