Java 如何按thread1打印一半数字,按thread2打印另一半数字

Java 如何按thread1打印一半数字,按thread2打印另一半数字,java,multithreading,Java,Multithreading,我做了一个程序,用两个线程打印5个数字 public class Class1 { static int value = 6; public void show() { for (int i = 0; i < value; value--) { System.out.println(Thread.currentThread().getName() + " - Number: " + value); } } public static void main

我做了一个程序,用两个线程打印5个数字

public class Class1 {

static int value = 6;
 public void show() {
    for (int i = 0; i < value; value--) {
        System.out.println(Thread.currentThread().getName() + " - Number: " + value);
    }
} 
public static void main(String[] args) {
    final Class1 main = new Class1();

    Runnable runner = new Runnable() {
        @Override
        public void run() {
            main.show();
        }
    };

    new Thread(runner, "Thread 1").start();
    new Thread(runner, "Thread 2").start();
}   }
但我希望它能给我这样的输出

Thread 1 - Number: 6
Thread 1 - Number: 5
Thread 1 - Number: 4
Thread 2 - Number: 3
Thread 2 - Number: 2
Thread 2 - Number: 1

我知道在show()方法中使用if-else条件很容易,但是在show()方法中,我不想使用if-else条件,我想在main()方法中更改一些东西,它们完成了工作。

你可以在第一个线程完成后再启动第二个线程,基本上,您需要同步线程执行

为此,您可以:

  • 用相同的键输入一个
    同步的
  • 在同一锁上使用
    等待
    通知
    关键字
  • 使用java
    Lock
  • 在第一个线程上使用
    join
    ,等待他完成后再开始第二个线程
  • 使用可观察的
    来协调线程的开始

还有许多其他的。

首先要做的是。您没有在线程中使用同步,如果要使用
join()
,则需要在run方法和

static int value = 6;
这不是线程安全的!为了更好地使用原子整数,并控制ADS检查

您可以按如下方式操作:

final int number = 6;
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            for(int i = 0; i< number/2;i++){
                System.out.println("Thread 1 Number: "+i);
            }
        }
    });
    Thread t2 = new Thread(new Runnable() {

        @Override
        public void run() {
            for(int i = number/2; i< number;i++){
                System.out.println("Thread 2 Number: "+i);
            }
        }
    });
        t1.run();
        t2.run();
最终整数=6;
线程t1=新线程(新的可运行线程(){
@凌驾
公开募捐{
对于(int i=0;i
你想让第二个线程只在第一个线程结束时才开始吗?@Hearner我想在最后一个线程中显示出来post@Hearner我想当线程1打印6,5,4时,我们锁定线程1,然后锁定线程2打印。最简单的解决方案是使用一个线程!其他任何东西看起来都会非常麻烦和低效。@PeterLawrey我知道使用一个线程可以解决问题,但这是我的大学作业,我在互联网上搜索,但无法完成这项工作。你能对我的代码进行编辑吗,这样我才能更好地理解。我是新来的线程,这将是一个伟大的爱好好。我已经为线程1之后运行的线程2进行了编辑。我希望这会有所帮助。注意:如果您将
start()
替换为
run()
,则不需要加入我认为OP需要让它看起来像是涉及多个线程。是的@mstfyldz如果有10个线程,那么我们重写run()方法10次?@mstfyldz我认为这不是一个好方法,你对此有何看法?
final int number = 6;
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            for(int i = 0; i< number/2;i++){
                System.out.println("Thread 1 Number: "+i);
            }
        }
    });
    Thread t2 = new Thread(new Runnable() {

        @Override
        public void run() {
            for(int i = number/2; i< number;i++){
                System.out.println("Thread 2 Number: "+i);
            }
        }
    });
        t1.run();
        t2.run();
public class PrintHalfNumber {

  public static void main(String[] args) {

    Printer sp = new Printer();

    ExecutorService executor = Executors.newFixedThreadPool(2);
    executor.submit(new SecondHalfProducer(sp, 10));
    executor.submit(new FirstHalfProducer(sp , 10));
    executor.shutdown();
  }

}


class Printer {

  Semaphore secondHalf = new Semaphore(0);
  Semaphore firstHalf = new Semaphore(1);

  public void printSecondHalf(int num) {
    try {
        secondHalf.acquire();
    }catch(InterruptedException exception) {

    }
    for(int i = (num/2) + 1 ; i <= num ; i++ ) {
        System.out.println("Thread 2 - Number: " + i);
    }

    firstHalf.release();
  }

  public void printFirstHalf(int num) {
    try {
        firstHalf.acquire();
    }catch(InterruptedException exception) {

    }
    for(int i = 1 ; i <= num/2 ; i++) {
        System.out.println("Thread 1 - Number: " + i);
    }

        secondHalf.release();
  }

}

class SecondHalfProducer implements Runnable {

  Printer sp;
  int index;

  SecondHalfProducer(Printer sp , int index) {
    this.sp = sp;
    this.index = index;
  }

  @Override
  public void run() {
    sp.printSecondHalf(index);
  }
}

class FirstHalfProducer implements Runnable{
  Printer sp;
  int index;

  FirstHalfProducer(Printer sp , int index) {
    this.sp = sp;
    this.index = index;
  }

  @Override
  public void run() {
        sp.printFirstHalf(index);
  }
}
Thread 1 - Number: 1

Thread 1 - Number: 2

Thread 1 - Number: 3

Thread 1 - Number: 4

Thread 1 - Number: 5

Thread 2 - Number: 6

Thread 2 - Number: 7

Thread 2 - Number: 8

Thread 2 - Number: 9

Thread 2 - Number: 10