2

基本上它的作用是像这样按顺序打印以下 2 和 3 的倍数

 2       3       4       6       6       9       8       12      10    = this is the output
(2*1=2) (3*1=3) (2*2=4) (3*2=6) (2*3=6) (3*3=9) (2*4=8) (3*4=12) (2*5=10) = just a guide

到目前为止,这是我的代码,我无法按顺序显示它。我试过使用等待和通知,但它一团糟。到目前为止,这个正在工作。

public class Main {

    public static void main(String[] args) throws InterruptedException {

        final Thread mulof2 = new Thread(){
            public void run() {
                for (int i = 1; i <= 10; i++) {
                    int n = 2;
                    int result = n * i;
                    System.out.print(result + " ");
                }
            }
        };
        Thread mulof3 = new Thread(){
            public void run() {
                for (int i = 1; i <= 10; i++) {
                    int n = 3;
                    int result = n * i;
                    System.out.print(result + " ");
                }
            }
        };
        mulof2.start();
        mulof3.start();

    }

}
4

6 回答 6

2

对于 Java 7,您的首选应该是Phaser. 您只需要它的一个实例,使用new Phaser(1). 您只需要两种协调方法:arriveawaitAdvance.

于 2012-07-29T14:30:59.507 回答
1

java中使用线程概念的乘法表

public class Multiplication extends Thread {

     public void run() {
         for (int i = 1; i < 10; i++) {
             int n = 2;
             int result = n * i;
             System.out.print(i+"*"+n+"="+result+"\n");
         }
     }


    public static void main(String[] args) throws InterruptedException {

        Multiplication mul=new Multiplication();
        mul.start();

        }

}
于 2015-03-27T05:48:11.243 回答
0

您可以将结果聚合为字符串,然后按顺序打印两个字符串,而不是在计算期间打印。当然是在加入线程之后。

于 2012-07-29T13:24:56.487 回答
0

wait()并且notify()通常级别太低,使用起来太复杂。尝试使用更高级的抽象,例如Semaphore.

你可以有一对 Semaphore 实例:一个允许打印下一个 2 的倍数,另一个允许打印下一个 3 的倍数。一旦打印了下一个 2 的倍数,线程应该允许打印下一个 3 的倍数,反之亦然。

当然,信号量的初始许可数对于 2 的倍数的信号量必须是 1,对于另一个信号量必须是 0。

于 2012-07-29T13:39:20.943 回答
0

一个简单的修改将帮助您获得所需的序列。

正如其他人指出的那样,您需要声明一个信号量private Semaphore semaphore;。然后声明另一个变量来表示接下来必须执行哪个线程,例如private int threadToExecute;.

下一步是在您的线程中执行和之间的semaphore.acquire();代码semaphore.release();

线程2:

try{
semaphore.acquire();
if(threadToExecute ==2)
  semaphore.release();

//write your multiply by 2 code here
threadToExecute = 3;

semaphore.release();
}catch(Exception e){
//exceptions
}

这将很好地同步您的输出。

于 2012-07-29T14:14:20.233 回答
0

下面是可以为您提供所需结果的代码。

公共类主要{

public static void main(String[] args) throws InterruptedException {

    final Object lock1 = new Object();
    final Object lock2 = new Object();

    final Thread mulof2 = new Thread(){
        public void run() {
            for (int i = 1; i <= 10; i++) {
                synchronized (lock1) {
                    synchronized (lock2) {
                        lock2.notify();
                        int n = 2;
                        int result = n * i;
                       printResult(result);
                    }
                    try {
                        lock1.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }                    
            }
        }
    };
    Thread mulof3 = new Thread(){
        public void run() {
            for (int i = 1; i <= 10; i++) {
                synchronized (lock2) {
                    synchronized (lock1) {
                         lock1.notify();
                         int n = 3;
                         int result = n * i;
                         printResult(result);
                    }
                    try {
                        lock2.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

            }
        }
    };
    mulof2.start();
    mulof3.start();

}

static void printResult(int result)
{
    try {
        // Sleep a random length of time from 1-2s
         System.out.print(result + " ");
        Thread.sleep(new Random().nextInt(1000) + 1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }       
}

}

于 2013-11-14T12:27:07.877 回答