控制台与Thread共享

时间:2011-12-09 21:07:23

标签: java multithreading console

我在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();
    }

}

2 个答案:

答案 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>将是一个很好的起点。