我在java中遇到MT的简单问题。我很想将访问同步到控制台。一个例子: 第一个线程写入System.out“第一个”Thread2 printl(“第二个”)。我想在没有缓冲的情况下同步这个线程在控制台中顺序写入数字。这是怎么回事?
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();
}
}
答案 0 :(得分:2)
我担心这是一个相当无用的问题,因为如果我们想要一个顺序排序线程是相当无用的,但是哦,这是一个解决方案:假设我们有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();
}
}
线程本身的逻辑留给读者练习。
答案 1 :(得分:0)
使用Queue<String>
并将String
添加到队列中。然后从队列中获取专用线程并将其写入控制台。这将根据线程的队列访问创建FIFO排序。
如果您不想使用队列,则应该使用令牌管理器来切换阻塞的线程。每个参与线程的Exchanger<V>
将是一个很好的起点。