gpt4 book ai didi

java - 与线程共享控制台

转载 作者:行者123 更新时间:2023-12-02 08:04:04 24 4
gpt4 key购买 nike

我在 Java 中遇到 MT 的简单问题。我想同步对控制台的访问。一个例子:第一个线程在 System.out 中写入“Number one”Thread2 printl(“Number Two”)。我想同步这个线程在控制台中按顺序写入数字而无需缓冲。这是怎么做的?

Thread one
Thread two
Thread one
Thread two
...

//代码

package com.example;

public class MyThread implements Runnable{


@Override
synchronized public void run(){
while(true){
System.out.println("Thread first");

}
}

}

//

package com.example;

public class MyThread2 implements Runnable {


@Override
synchronized public void run() {
// TODO Auto-generated method stub
System.out.println("");

}

}

//

 package com.example;

import java.util.concurrent.Semaphore;

public class Main {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

Thread th1= new Thread(new MyThread());
Thread th2= new Thread(new MyThread2());

th2.setPriority(Thread.MAX_PRIORITY);
th1.start();
th2.start();
}

}

最佳答案

好吧,我担心这是一个相当无用的问题,因为如果我们想要顺序排序,线程就相当无用,但是哦,好吧,这里有一个解决方案:假设我们有 N 个线程。

线程 0 应该写入数字 0, N, 2N, 3N,..

线程 1 应写入数字 1、N+1、2N+1、3N+1

好吧,你明白了。这个怎么做?很简单,我们基本上只需要一个等待轮到我们编写的方法。为了简单起见,使用静态对象的真正简单的解决方案:

private static volatile int globalVal = 0;
private static Object lock = new Object();

public void writeInt(int val) {
synchronized(lock) {
while (globalVal != val) {
try {
lock.wait();
}
catch(InterruptedException e) {
}
}
System.out.println(val);
globalVal++;
lock.notifyAll();
}
}

线程本身的逻辑留给读者作为练习。

关于java - 与线程共享控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8451714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com