Java 如何按thread1打印一半数字,按thread2打印另一半数字
我做了一个程序,用两个线程打印5个数字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
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